面試問(wèn)題:如果兩個(gè)客戶端同時(shí)執(zhí)行一個(gè)查詢sql,為什么查出的數(shù)據(jù)可能不一樣?
解答:是因?yàn)閙ysql底層維護(hù)了一個(gè)undo日志版本鏈和read-view一致性試圖機(jī)制,在repeatable-read隔離級(jí)別下,一個(gè)事務(wù)開(kāi)啟之后,當(dāng)執(zhí)行查詢語(yǔ)句的時(shí)候,就生成了一個(gè)read-view,之后查詢就會(huì)根據(jù)一定的規(guī)則去undo日志版本鏈中比對(duì)數(shù)據(jù);在read-commited隔離級(jí)別下,一個(gè)事務(wù)開(kāi)啟之后,每次執(zhí)行查詢語(yǔ)句的時(shí)候,都生成新的read-view,查詢就會(huì)根據(jù)和repeatable-read隔離級(jí)別下一樣的規(guī)則去undo日志版本鏈中比對(duì)數(shù)據(jù)。
對(duì)比規(guī)則如下:
如果版本鏈中的trx_id<min_id,說(shuō)明當(dāng)前事務(wù)可見(jiàn);
如果版本鏈中的trx_id>max_id,說(shuō)明當(dāng)前事務(wù)不可見(jiàn);
如果版本鏈中的min_id<=trx_id<=max_id,存在兩種判斷。
????????若版本鏈中的trx_id位于數(shù)組中,則說(shuō)明這個(gè)版本是由未提交的事務(wù)生成,不可見(jiàn)。
????????若版本鏈中的trx_id不在數(shù)組中,說(shuō)明這個(gè)版本是由已提交的事務(wù)生成,可見(jiàn)。
如下例:

分析:
