MySQL鎖系列(四)之undolog
什麼是undo
1) redo 記錄的是對頁的重做日誌,undo 記錄的是對事務的逆向操作
2) undo 會產生redo,undo的產生也會伴隨這redo的產生,因為重啟恢復的時候,可以通過redo還原這些undo的操作,以達到回滾的目的
undo有什麼用
1) 用於對事務的回滾
2)用於MVCC
undo的儲存結構
- rollback segment
* 在MySQL5.1的年代,一個MySQL例項,就只有一個rollback segment
* 在MySQL5.1+ 的年代,一個MySQL例項裡面,可以有128個rollback segment
- undo segment
* 一個segment 有 1024 個 undo slot,一個undo slot 對應一個undo log
* 一個事務(dml)對應一個undo log
- 總結
據此推斷:
1) 5.1 最多能夠承載的併發事務(dml),1 * 1024 = 1024
2)5.1+ 最多能夠承載的併發事務(dml),128 * 1024 = 10w左右
從此可以看出,5.1 之後的版本支援的併發寫入事務數更多,效能更好
undo的格式
- insert_undo
1) insert操作產生的undo
2)為什麼要單獨出來,因為insert的undo可以立馬釋放(不需要purge),不需要判斷是否有其他事務引用,本來insert的事務也沒有任何事務可以看見它嘛
- update_undo
1)delete 或者 update 操作產生的undo日誌
2)判斷undo是否可以被刪除,必須看這個undo上面是否被其他事務所引用
3) 如果沒有任何事務引用,那麼可以由後臺執行緒purge掉這個undo
- 如何判斷undo日誌是否有其他事務引用呢
1. 每一個undo log中都有一個DB_trx_id , 這個id記錄的是該undo最近一次被更新的事務id
2. 如果這個id 不在readview(活躍事務列表) 裡面,就可以認為沒事務引用,即可刪除?
undo存放在哪裡
1) 5.6之前的版本,undo都是存放在ibdata,也就是所謂的共享表空間裡面的
2) 5.6以及之後的版本,可以配置存放在單獨的undo表空間中
什麼是purge
1) delete語句操作的後,只會對其進行delete mark,這些被標記為刪除的記錄只能通過purge來進行物理的刪除,但是並不回收空間
2)undo log,如果undo 沒有任何事務再引用,那麼也只能通過purge執行緒來進行物理的刪除,但是並不回收空間
purge後空間就釋放了嗎
1) undo page裡面可以存放多個undo log日誌
2)只有當undo page裡面的所有undo log日誌都被purge掉之後,這個頁的空間才可能被釋放掉,否則這些undo page可以被重用
DML的相關物理實現演算法
- 主鍵索引
1. 對於delete --需要undo繫結該記錄才能進行回滾,所以只能打上標記,否則undo指向哪裡呢
delete mark
2. 對於update --原記錄可以物理刪除,因為可以在新插入進來的地方進行undo繫結
* 如果不能原地更新: delete(注意:這裡是直接delete,而不是delete mark) + insert
* 如果可以原地更新,那麼直接update就好
- 二級索引
1. 對於delete --不能直接被物理刪除,因為二級索引沒有undo,只能通過打標記,然後回滾。否則如果被物理刪除,則無法回滾
delete mark
2. 對於update --不能直接被物理刪除,因為二級索引沒有undo,只能通過打標記,然後回滾。否則如果被物理刪除,則無法回滾
delete mark + insert
相關文章
- 【MySQL】死鎖案例之四MySql
- InnoDB學習(四)之RedoLog和UndoLog
- MySQL鎖系列(九)之longtransactionMySql
- 深入理解MySQL系列之鎖MySql
- MySQL四種日誌binlog/redolog/relaylog/undologMySql
- MySQL 四 鎖MySql
- S 鎖與 X 鎖的愛恨情仇《死磕MySQL系列 四》MySql
- MySQL鎖(四)行鎖的加鎖規則和案例MySql
- 手記系列之四 ----- 關於使用MySql的經驗MySql
- 【MySQL】MySQL(四)儲存引擎、索引、鎖、叢集MySql儲存引擎索引
- 通過10046分析v$lock持鎖模式lmode之系列四模式
- 精通MySQL之鎖篇MySql
- MySQL死鎖系列-常見加鎖場景分析MySql
- MySQL死鎖系列-線上死鎖問題排查思路MySql
- MySQL強人“鎖”難《死磕MySQL系列 三》MySql
- MySQL 行級鎖之 間隙鎖、臨鍵鎖MySql
- 【MySQL】死鎖案例之六MySql
- 【MySQL】死鎖案例之七MySql
- 【MySQL】死鎖案例之八MySql
- mysql之鎖與事務MySql
- MySQL系列第四篇:利用MySQL工具之SQLYog進行資料匯入MySql
- 《xhtml入門系列》之四HTML
- MySQL學習之全域性鎖和表鎖MySql
- 聊聊MySQL的加鎖規則《死磕MySQL系列 十五》MySql
- Mysql研磨之InnoDB行鎖模式MySql模式
- RxBinding系列之RxAdapterView(四)APTView
- MySQL之四 儲存引擎MySql儲存引擎
- 【MySQL】5.7新特性之四MySql
- java面試一日一題:講下mysql中的undologJava面試MySql
- 【鎖】Oracle鎖系列Oracle
- RxJS 系列之四 - Subject 詳解JS
- .NET進階系列之四:深入DataTable
- 隨筆之:VC操作Word系列(四)
- [玩轉MySQL之四]MySQL快取機制MySql快取
- 資料庫系列:MySQL InnoDB鎖機制介紹資料庫MySql
- MySQL優化篇系列文章(二)——MyISAM表鎖與InnoDB鎖問題MySql優化
- iOS動畫系列之四:基礎動畫之平移篇iOS動畫
- mysql鎖之死鎖MySql