MVCC只在READ COMMITED和REPEATABLE READ兩個(gè)隔離級(jí)別下工作。
現(xiàn)在通過(guò)具體的例子說(shuō)明MVCC的原理
假設(shè)F1-F6是表中字段的名字,1-6是其對(duì)應(yīng)的數(shù)據(jù)。后面三個(gè)隱含字段分別對(duì)應(yīng)該行的隱含ID(DB_ROW_ID)、事務(wù)號(hào)(DB_TRX_ID,最新更新這條記錄的事務(wù)ID)和回滾指針(DB_ROLL_PT,指向當(dāng)前記錄項(xiàng)的回滾的undo log記錄 )
第一步
假設(shè)這條數(shù)據(jù)是剛INSERT的,可以認(rèn)為ID為1,其他兩個(gè)字段為空。

image.png
第二步
當(dāng)事務(wù)1更改該行的時(shí)候,會(huì)進(jìn)行如下操作:用排它鎖鎖定該行;記錄redo log;把該行修改前的值copy到undo log,即圖中下面的行;修改當(dāng)前行的值,填寫(xiě)事務(wù)編號(hào),使回滾指針指向undo log中的修改前的行;

image.png
第三步
與事務(wù)1相同,此時(shí)undo log中有兩條記錄,并通過(guò)回滾指針連在一起。因此如果undo log如果一直不刪除,則會(huì)通過(guò)當(dāng)前記錄的回滾指針回溯到該行創(chuàng)建時(shí)的初始內(nèi)容,所幸的是InnoDB中有purge線程,它會(huì)查詢(xún)并刪除比現(xiàn)在最老的活動(dòng)事務(wù)還早的undo log,從而保證undo log文件不至于無(wú)限增長(zhǎng)。

image.png