面試官:你瞭解MySQL的四大特性嗎?
李三:知道的,MySQL的四大特性即ACID。原子性、一致性、隔離性、持久性。
面試官:嗯,然後了?
李三: 原子性(atomicity)是指一個事務不可分割,要麼全部提交成功,要麼全部失敗回滾; 一致性(consistency)是指一個事務能保證數據庫從一個有效(正確)的狀態“轉移”到另一個有效(正確)的狀態。 隔離性(isolation)指一個事務所做的修改在最終提交以前,對其他事務是不可見的。 持久性(durability)是指事務提交成功,所做的修改就一定會永久保存到數據庫中。
面試官:那再詳細談談四大特性是怎麼實現?
李三:(幸好我今天看了這篇文章)哦哦哦,簡單來說是這樣的:
-
原子性是通過undo log日誌保證的。
-
一致性一般是業務層進行邏輯判斷實現的,比如限定餘額不能爲負。
-
隔離性是通過多版本併發控制機制實現的。
-
持久性是通過redo log日誌保證的。
面試官:聊聊MySQL的三種日誌?
在MySQL中,有三種日誌。分別是redo log、binlog和undo log。
redo log 和 binlog
1、存儲的內容
可以這樣理解,binlog
記載的是update/delete/insert
這樣的SQL語句,而redo log
記載的是物理修改的內容(xxxx頁修改了xxx)。所以在搜索資料的時候也會有這樣的說法:binlog
記錄的是數據的邏輯變化,redo log
記錄的是數據的物理變化
2、功能
redo log
的作用是實現持久化。數據庫更新寫完內存,如果數據庫掛了,那我們可以通過redo log
來恢復內存還沒來得及刷到磁盤的數據,將redo log
加載到內存裏邊,那內存就能恢復到掛掉之前的數據了。
binlog
的作用是進行複製和恢復。
-
主從服務器需要保持數據的一致性,通過
binlog
來同步數據。 -
如果整個數據庫的數據都被刪除了,
binlog
存儲着所有的數據變更情況,那麼可以通過binlog
來對數據進行恢復。
3、載體
redo log是InnoDB引擎特有的。binlog是MySQL的Server層實現的,所有引擎都可以使用。
4、記錄方式
redo log是循環寫的,空間固定會用完;binlog是追加寫入的,一個文件寫滿後會切換到下一個文件而不會去覆蓋以前的日誌。
undo log
undo log
主要有兩個作用:回滾和多版本併發控制(MVCC)
在數據修改的時候,不僅記錄了redo log
,還記錄undo log
,如果因爲某些原因導致事務失敗或回滾了,可以用undo log
進行回滾undo log
主要存儲的也是邏輯日誌,比如我們要insert
一條數據了,那undo log
會記錄的一條對應的delete
日誌。我們要update
一條記錄時,它會記錄一條對應相反的update記錄。
回滾的實現就是找到undo log中對應的相反操作語句執行。 而多版本併發控制則是利用undo log做版本的回退(聊MVCCC時再具體講)
那你再說說多版本併發控制吧
那接着聊聊redo log、binlog和undo log的更新過程?