“redo log(重做日誌) 保證事務的持久性,使用 undo log(回滾日誌) 來保證事務的原子性”這句話怎麼理解?

MySQL InnoDB 引擎使用 redo log(重做日誌) 保證事務的持久性,使用 undo log(回滾日誌) 來保證事務的原子性

哪位大神可以展開講講:

  • redo log(重做日誌) 如何保證事務的持久性?
  • undo log(回滾日誌) 如何來保證事務的原子性?

 

MySQL怎麼保證持久性?

保證持久性,其實很簡單,只用把該事務在內存中修改的全部頁面刷新到磁盤就可以了,但是,這些頁面可能並不相鄰,需要進行很多隨機IO,對於傳統的機械硬盤就會特別慢,所以,爲了提升效率,設計MySQL的大叔就引入了redo log,它只用來保存事務對數據頁所做的修改,

比如,當一條記錄需要更新時,Innodb引擎會先把對這個數據頁的修改 寫到redo log buffer中,事務提交時再把redo log buffer刷到磁盤文件redo log中,這樣是追加寫,順序IO速度很快.

我想你一定會問, 那什麼時候更新到磁盤上的數據頁呢?

MySQL會根據redo log自動在系統空閒時完成更新磁盤數據頁的操作, 這個過程也叫做刷盤, 會對MySQL性能有一定影響

你可能還會問, 那不及時刷到硬盤上不會導致下次讀出來的還是舊數據嗎?

不會的, 你記到redo log buffer的時候, 你這個數據頁的內容已經讀到內存了, 內存裏面的這個數據頁的內容已經被更新了, 以後都是都內存中的這個最新版本

你可能還會問, 那隻用內存裏的數據那宕機了咋辦?

這不就體現了redo log的作用, 你對數據頁的修改都記錄在redo log了, 宕機了根據redo log的內容恢復就好, 默認設置下事務只要提交就會持久化到磁盤文件redo log中

MySQL怎麼保證原子性?

原子性指的是事務中的所有操作是一個不可分割的整體, 要麼全做, 要麼全不做.

利用Innodb引擎的undo log(回滾日誌),它記錄了回滾一個操作必需的內容

比如,當你update一條數據的時候,就需要這條記錄的原始值,回滾的時候,把這條記錄再update爲原始值

這樣,當事務執行失敗,就可以根據undo log回滾之前執行成功的操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章