MVCC只在READ COMMITED和REPEATABLE READ兩個隔離級別下工作褒搔。
現(xiàn)在通過具體的例子說明MVCC的原理
假設(shè)F1-F6是表中字段的名字链嘀,1-6是其對應(yīng)的數(shù)據(jù)阻桅。后面三個隱含字段分別對應(yīng)該行的隱含ID(DB_ROW_ID)、事務(wù)號(DB_TRX_ID,最新更新這條記錄的事務(wù)ID)和回滾指針(DB_ROLL_PT,指向當(dāng)前記錄項(xiàng)的回滾的undo log記錄 )
第一步
假設(shè)這條數(shù)據(jù)是剛INSERT的灭将,可以認(rèn)為ID為1,其他兩個字段為空后控。
第二步
當(dāng)事務(wù)1更改該行的時候庙曙,會進(jìn)行如下操作:用排它鎖鎖定該行;記錄redo log浩淘;把該行修改前的值copy到undo log捌朴,即圖中下面的行;修改當(dāng)前行的值张抄,填寫事務(wù)編號砂蔽,使回滾指針指向undo log中的修改前的行;
第三步
與事務(wù)1相同署惯,此時undo log中有兩條記錄左驾,并通過回滾指針連在一起。因此如果undo log如果一直不刪除极谊,則會通過當(dāng)前記錄的回滾指針回溯到該行創(chuàng)建時的初始內(nèi)容诡右,所幸的是InnoDB中有purge線程,它會查詢并刪除比現(xiàn)在最老的活動事務(wù)還早的undo log轻猖,從而保證undo log文件不至于無限增長帆吻。