1. Undo Log 介紹
Undo
:意為撤銷或取消镜粤,以撤銷操作為目的韵吨,返回指定某個(gè)狀態(tài)的操作Undo Log
:數(shù)據(jù)庫(kù)事務(wù)開(kāi)始之前座掘,會(huì)將要修改的記錄存放到Undo
日志里苞尝,當(dāng)事務(wù)回滾時(shí)或者數(shù)據(jù)庫(kù)崩潰時(shí),可以利用Undo
日志访惜,撤銷未提交事務(wù)對(duì)數(shù)據(jù)庫(kù)產(chǎn)生的影響嘹履。Undo Log
產(chǎn)生和銷毀:Undo Log
在事務(wù)開(kāi)始前產(chǎn)生腻扇;事務(wù)在提交時(shí),并不會(huì)立刻刪除undo log
植捎,innodb
會(huì)將該事務(wù)對(duì)應(yīng)的undo log
放入到刪除列表中衙解,后面會(huì)通過(guò)后臺(tái)線程purge thread
進(jìn)行回收處理阳柔。Undo Log
屬于邏輯日志焰枢,記錄一個(gè)變化過(guò)程。例如:執(zhí)行一個(gè)delete
舌剂,undolog
會(huì)記錄一個(gè)insert
济锄;執(zhí)行一個(gè)update
,undolog
會(huì)記錄一個(gè)相反的update
霍转。Undo Log
存儲(chǔ):undo log
采用段的方式管理和記錄荐绝。在innodb
數(shù)據(jù)文件中包含一種rollback segment
回滾段,內(nèi)部包含1024
個(gè)undo log segment
避消〉吞玻可以通過(guò)下面一組參數(shù)來(lái)控制Undo log
存儲(chǔ)
SHOW VARIABLES LIKE '%innodb_undo%';
2. Undo Log 作用
- 實(shí)現(xiàn)事務(wù)的原子性
Undo Log
是為了實(shí)現(xiàn)事務(wù)的原子性而出現(xiàn)的產(chǎn)物。事務(wù)處理過(guò)程中岩喷,如果出現(xiàn)了錯(cuò)誤或者用戶執(zhí)行了ROLL BACK
語(yǔ)句恕沫,MySQL
可以利用Undo Log
中的備份將數(shù)據(jù)恢復(fù)到事務(wù)開(kāi)始之前的狀態(tài)。 - 實(shí)現(xiàn)多版本并發(fā)控制(
MVCC
)
Undo Log
在MySQL InnoDB
存儲(chǔ)引擎中用來(lái)實(shí)現(xiàn)多版本并發(fā)控制纱意。事務(wù)未提交之前婶溯,Undo Log
保存了未提交之前的版本數(shù)據(jù),Undo Log
中的數(shù)據(jù)可作為數(shù)據(jù)舊版本快照供其他并發(fā)事務(wù)進(jìn)行快照讀偷霉。
- 事務(wù)
A
手動(dòng)開(kāi)啟事務(wù)迄委,執(zhí)行更新操作,首先會(huì)把更新命中的數(shù)據(jù)備份到Undo Buffer
中 - 事務(wù)
B
手動(dòng)開(kāi)啟事務(wù)类少,執(zhí)行查詢操作叙身,會(huì)讀取Undo
日志數(shù)據(jù)返回,進(jìn)行快照讀