參考:https://mp.weixin.qq.com/s/R3yuitWpHHGWxsUcE0qIRQ,文中例子截取自上文
redo、undo、回滾段
- redo:主要解決如果每次修改數據都去磁盤上隨機讀寫,效率很低。所以改爲順序寫入到redo日誌中然後定期去修改磁盤。即使是數據庫奔潰也可以依靠redo重做。保證事務的acid
- undo:在事務提交之前,會將修改的舊數據存放到undo日誌中,新數據記錄到redo中。可以利用undo日誌來回滾。
- 回滾段:存儲undo日誌的地方
- 下面是一個例子,很清楚的說明其中的關係
innodb實現多版本併發控制
- 關鍵:舊版本數據存放在回滾段中,同時這種架構對mysql衝擊不大
- 每行數據會記錄:
- DB_TRX_ID,最近一次修改它的事務ID;
- DB_ROLL_PTR,指向undo的指針;
- DB_ROW_ID,單調遞增的行ID;
- 通過這種方式就可以再undo中獲取到歷史數據的快照,叫快照讀
- 一般情況下select語句直接讀快照,當然也可以獲取排它鎖