mysql事務的實現原理(附別人鏈結)

2021-10-06 22:11:10 字數 1107 閱讀 9938

innodb儲存引擎還提供了兩種事務日誌:redo log(重做日誌)和undo log(回滾日誌)。其中redo log用於保證事務永續性;undo log則是事務原子性和隔離性實現的基礎。

當事務對資料庫進行修改時,innodb會生成對應的undo log;如果事務執行失敗或呼叫了rollback,導致事務需要回滾,便可以利用undo log中的資訊將資料回滾到修改之前的樣子。

undo log屬於邏輯日誌,它記錄的是sql執行相關的資訊。當發生回滾時,innodb會根據undo log的內容做與之前相反的工作:對於每個insert,回滾時會執行delete;對於每個delete,回滾時會執行insert;對於每個update,回滾時會執行乙個相反的update,把資料改回去。

redo log與binlog

我們知道,在mysql中還存在binlog(二進位制日誌)也可以記錄寫操作並用於資料的恢復,但二者是有著根本的不同的:

(1)作用不同:redo log是用於crash recovery的,保證mysql宕機也不會影響永續性;binlog是用於point-in-time recovery的,保證伺服器可以基於時間點恢復資料,此外binlog還用於主從複製。

(2)層次不同:redo log是innodb儲存引擎實現的,而binlog是mysql的伺服器層(可以參考文章前面對mysql邏輯架構的介紹)實現的,同時支援innodb和其他儲存引擎。

(3)內容不同:redo log是物理日誌,內容基於磁碟的page;binlog的內容是二進位制的,根據binlog_format引數的不同,可能基於sql語句、基於資料本身或者二者的混合。

(4)寫入時機不同:binlog在事務提交時寫入;redo log的寫入時機相對多元:

前面曾提到:當事務提交時會呼叫fsync對redo log進行刷盤;這是預設情況下的策略,修改innodb_flush_log_at_trx_commit引數可以改變該策略,但事務的永續性將無法保證。

除了事務提交時,還有其他刷盤時機:如master thread每秒刷盤一次redo log等,這樣的好處是不一定要等到commit時刷盤,commit速度大大加快。

MySQL事務實現原理

以上是sql 92標準中定義的四種隔離級別。在mysql中,預設的隔離級別是repeatable read 可重複讀 並且解決了幻讀問題。不可重複讀重點在於update和delete,而幻讀的重點在於insert insert update delete 快照讀和當前讀 鎖定讀一致性非鎖定讀假如乙個...

MySQL事務隔離級別實現原理

在mysql的眾多儲存引擎中,只有innodb支援事務,所有這裡討論的事務隔離級別指的是mysql innodb下的事務隔離級別,一般而言,隔離級別分為 讀未提交 乙個事務可以讀取到另乙個事務未提交的修改。這會帶來髒讀 幻讀 不可重複讀問題,很少使用這個級別。讀已提交 乙個事務只能讀取另乙個事務已經...

Mysql中事務ACID實現原理

照例,我們先來乙個場景 面試官 知道事務的四大特性麼?你 懂,acid嘛,原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 面試官 你們是用mysql資料庫吧,能簡單說說innodb中怎麼實現這四大特性的麼?你 我只知道隔離性是怎麼...