Innodb 是如何實現事務的?

InnoDB 是 MySQL 中最常用的存儲引擎之一,它通過一系列複雜的機制和策略來實現事務的 ACID 特性(原子性、一致性、隔離性和持久性)。

以下是 InnoDB 實現事務的詳細過程和關鍵機制:

1. 事務的啓動和結束

2. 日誌系統

Redo Log(重做日誌)

  1. 當事務對數據庫進行修改時,先將修改記錄寫入重做日誌。

  2. 事務提交時,重做日誌會被持久化到磁盤。

  3. 如果系統崩潰,可以通過重做日誌恢復數據。

Undo Log(回滾日誌)

3. 併發控制

MVCC(多版本併發控制)

####鎖機制

4. 事務的隔離級別

InnoDB 支持四種事務隔離級別,分別是:

5. 事務的原子性

通過 Redo Log 和 Undo Log 的協同工作,InnoDB 能夠保證事務的原子性。如果事務在執行過程中失敗,所有已經執行的操作都會被撤銷,確保事務中的所有操作要麼全部完成,要麼全部不完成。

6. 事務的持久性

通過 Redo Log 的持久化,即使系統崩潰,InnoDB 也能通過重做日誌恢復數據,保證事務的持久性。

簡單示例講解

舉例一個簡單的銀行轉賬場景。

假設我們有一個名爲accounts的表,它存儲了客戶的賬戶信息,包括賬戶 ID、客戶姓名和賬戶餘額。

通過這個表來演示如何使用 InnoDB 的事務來保證轉賬操作的原子性和一致性。

accounts 表結構

SQL 事務操作

下面是一個簡單的 SQL 事務示例,用於從一個賬戶轉賬到另一個賬戶:

-- 開始事務
START TRANSACTION;

-- 1. 從賬戶1轉出100元
UPDATE accounts
SET balance = balance - 100
WHERE account_id = 1;

-- 2. 向賬戶2轉入100元
UPDATE accounts
SET balance = balance + 100
WHERE account_id = 2;

-- 檢查是否發生錯誤(在實際應用中,通常會有更復雜的錯誤處理邏輯)
-- 如果沒有錯誤,提交事務
COMMIT;

-- 如果發生錯誤,回滾事務
-- ROLLBACK; -- 這行代碼在正常情況下不會被執行,只有在發生錯誤時纔會用到

說明

  1. 開始事務

    •  START TRANSACTION;:這條語句開始了一個新的事務。在 InnoDB 中,事務是一組要麼全部成功要麼全部失敗的操作。
  2. 執行操作

    • 第一個UPDATE語句從賬戶 1 中轉出 100 元。

    • 第二個UPDATE語句向賬戶 2 中轉入 100 元。

    • 這兩個操作是事務的一部分,它們要麼同時成功,要麼同時失敗。

  3. 提交事務

    •  COMMIT;:如果所有操作都成功執行,沒有發生任何錯誤,那麼我們就提交事務。提交事務後,InnoDB 會將事務中的所有更改永久保存到數據庫中。
  4. 回滾事務(可選):

    • 如果在執行過程中發生任何錯誤(例如,賬戶 1 的餘額不足或賬戶 2 不存在),我們可以使用ROLLBACK;語句來回滾事務。回滾事務會撤銷事務中的所有操作,使數據庫恢復到事務開始之前的狀態。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/qwFsNR_oS2TLLMcEoZ2dNw