MySQL 事務

今夜有点儿凉發表於2024-12-05

MySQL 事務是指一組資料庫操作,在執行過程中要麼全部成功,要麼全部失敗。事務可以保證資料庫的原子性、一致性、隔離性和永續性(簡稱 ACID 特性),確保資料的正確性和一致性。

事務的四大特性(ACID)

  1. 原子性(Atomicity)

    • 事務中的所有操作要麼全部成功,要麼全部失敗。即使系統發生崩潰,事務中的操作也不會部分提交。
    • 例如,銀行轉賬操作,如果轉賬過程中涉及多個操作(如從賬戶A扣錢、往賬戶B存錢),要麼兩個操作都成功,要麼兩個操作都失敗。
  2. 一致性(Consistency)

    • 事務執行前後,資料庫都必須處於一致性狀態。事務開始之前,資料庫的狀態是合法的,執行完事務後,資料庫的狀態也是合法的。
    • 例如,銀行賬戶的餘額在轉賬前後必須是合法的,不能出現負餘額等不合理的狀態。
  3. 隔離性(Isolation)

    • 每個事務的執行不受其他事務的干擾,即使是併發執行的事務,彼此之間也不會相互影響。
    • MySQL 提供了多種 隔離級別 來控制事務之間的相互影響,如 讀未提交讀已提交可重複讀序列化
  4. 永續性(Durability)

    • 一旦事務提交,其對資料庫的修改就是永久性的,即使系統崩潰,已提交的事務修改也會被持久儲存。
    • 例如,銀行轉賬成功後,即使系統當機,賬戶餘額的變動也不會丟失。

MySQL 事務的基本操作

  1. 開啟事務(START TRANSACTION 或 BEGIN)

    • 開始一個新的事務。

      START TRANSACTION;
      -- 或者
      BEGIN;
  2. 提交事務(COMMIT)

    • 提交事務,將所有操作儲存到資料庫。

      COMMIT;
  3. 回滾事務(ROLLBACK)

    • 回滾事務,撤銷自上次提交以來的所有操作。

      ROLLBACK;

MySQL 事務的隔離級別

MySQL 提供了四種 事務隔離級別,它們影響事務之間的可見性和干擾程度:

  1. READ UNCOMMITTED(讀未提交)

    • 事務可以讀取未提交事務的資料(髒讀)。最低的隔離級別,可能導致資料不一致。
    • 優點:提高併發性。
    • 缺點:可能會發生髒讀、不可重複讀、幻讀。
  2. READ COMMITTED(讀已提交)

    • 事務只能讀取已提交事務的資料,避免了髒讀,但可能出現不可重複讀的現象。
    • 優點:避免髒讀,資料較一致。
    • 缺點:可能會出現不可重複讀和幻讀。
  3. REPEATABLE READ(可重複讀)

    • 事務在執行期間,讀取的資料會一直保持一致,避免了髒讀和不可重複讀。MySQL 預設的隔離級別。
    • 優點:避免了髒讀和不可重複讀。
    • 缺點:可能會發生幻讀。
  4. SERIALIZABLE(序列化)

    • 最高的隔離級別,事務將會以序列方式執行。事務之間完全隔離,避免了所有的併發問題,但效能較差。
    • 優點:完全避免了髒讀、不可重複讀和幻讀。
    • 缺點:效能差,事務執行的併發性降低。

MySQL 事務的鎖機制

為了實現事務的隔離性,MySQL 使用了多種 鎖機制,包括:

  1. 行鎖(Row Lock)

    • 鎖定某一行資料,其他事務不能修改該行,適用於 InnoDB 儲存引擎。
  2. 表鎖(Table Lock)

    • 鎖定整張表,其他事務無法對錶中的資料進行操作。表鎖會影響其他操作的併發性,但加鎖速度較快。
  3. 意向鎖(Intention Lock)

    • 用於標識一個事務想要對某些行加鎖,避免不同事務間發生衝突。
  4. 死鎖(Deadlock)

    • 當兩個事務互相等待對方持有的鎖時,發生死鎖,MySQL 會自動檢測死鎖並回滾其中一個事務。

事務的應用場景

  1. 銀行轉賬

    • 轉賬操作需要保證從一個賬戶扣款、向另一個賬戶存款的操作要麼全成功,要麼全失敗,避免資料不一致。
  2. 批次資料操作

    • 在處理多個插入、更新或刪除操作時,使用事務可以確保這些操作要麼全部成功,要麼全部回滾。
  3. 訂單支付系統

    • 訂單建立、庫存扣除、支付處理等操作需要在事務中執行,以保證訂單狀態的一致性。

總結

MySQL 事務是確保資料庫操作原子性、一致性、隔離性和永續性(ACID)的一種機制。透過事務,可以確保一組操作要麼全部成功,要麼全部回滾,從而保證資料的完整性和一致性。在實際應用中,合理設定事務隔離級別和鎖機制,可以最佳化資料庫的效能和併發能力。