事務ACID的實現

2021-07-30 12:51:39 字數 1464 閱讀 3956

事務需要滿足acid特性,那在資料庫中,它是如何實現的?我們接下來的內容將一一介紹。

其實我們在《mysql innodb引擎 mvcc併發控制》中談到了事務的隔離級別,但沒有談到怎樣實現隔離性。我們提到了要消除幻讀,一般的資料庫系統需要保證序列化的事務隔離級別,而mysql innodb在可重複讀的事務隔離級別下消除了幻讀,功勞應該歸於next-key lock鎖。這個具體詳述在《mysql innodb中的行鎖 next-key lock消除幻讀》。那說了半天事務隔離級別,隔離性到底是如何實現的?其實在上面我們已經談到了,是鎖機制+mvcc。我們通過mvcc使得事務隔離級別達到了可重複讀,使用鎖機制消除了幻讀,實現了事務隔離。需要注意的是,在使用分布式事務時,innodb儲存引擎的事務隔離級別必須設定為序列化。

通過資料庫的redo log重做日誌,來保證事務的永續性與原子性。

重做日誌由兩部分組成:重做日誌緩衝(記憶體)和重做日誌檔案(物理儲存)。當事務提交(commit)時,必須先將該事務的所有日誌寫入到重做日誌檔案進行持久化,待事務提交操作完成才算完成。redo log重做日誌基本上都是順序寫的。為了確保每次日誌都寫入重做日誌檔案,在每次將重做日誌快取寫入重做日誌檔案後,innodb儲存引擎都需要呼叫一次fsync(檔案同步)操作。當然mysql提供一些引數來調整緩衝重新整理到檔案的策略,在這裡就不細講了。

在innodb儲存引擎中,重做日誌都是以512位元組進行儲存的,稱為重做日誌塊。若乙個頁中產生的重做日誌數量大於512位元組,那麼需要分割為多個重做日誌塊進行儲存。由於重做日誌塊的大小與磁碟扇區大小一樣,都是512位元組,因此重做日誌的寫入可以保證事務的原子性。重做日誌塊大小為512位元組,但其中包含的有效儲存為492位元組,重做日誌檔案頭佔12位元組,日誌尾佔8位元組。

通過資料庫的undo log撤銷日誌,來保證事務的一致性。

為了完成事務的回滾操作,在對資料庫進行修改時,innodb儲存引擎不但會產生redo log,還會產生一定量的undo logo。undo log是邏輯日誌,只是將資料庫邏輯地恢復到原來的樣子,保證了事務的一致性(從乙個狀態轉換為下乙個一致性狀態)。

redo恢復提交事務修改的頁操作,undo回滾行記錄到某個特定版本。

redo通常是物理日誌,記錄的是頁的物理修改操作。undo是邏輯日誌,根據每行記錄進行記錄。

通常對undo的誤解是undo用於將資料庫物理地恢復到執行語句或事務之前的樣子。事實上,no!!!

舉個栗子:乙個事務在修改當前乙個頁中某幾條記錄,同時還有別的事務在對同乙個頁中另幾條記錄進行修改。因此,不能將乙個頁回滾到事務開始的樣子,因為這樣會影響其他事務正在進行的工作。所以,在上面我們說道undo log是邏輯日誌。

除了回滾操作,undo的另乙個作用是mvcc,在innodb儲存引擎中mvcc的實現是通過undo來完成。當使用者讀取一行記錄時,若該記錄已經被其他事務占用,當前事務可以通過undo讀取之前的行版本資訊,以此實現非鎖定讀。

undo log會產生redo log,undo操作需要永續性保護。

參考:

InnoDB事務的ACID特性和實現

1 acid特性 2 redo日誌 3 undo日誌 4 事務的4種隔離級別 事務可以由非常簡單的sql語句組成,也可以由一組複雜的sql語句組成,原子性要求事務的操作中,要麼都做,要麼都不做,事務中的任何一條sql語句執行失敗,已經執行成功的sql語句也必須撤銷,資料庫的狀態應回到執行事務前的狀態...

Mysql中事務ACID實現原理

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

Mysql中事務ACID實現原理

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