首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 事務嵌套機制解析:隱式提交陷阱與應用層模擬嵌套實現

     編輯:MySQL 綜合教學

MySQL 事務嵌套深度解析:原生不支援、隱式提交陷阱與應用層解決方案

一、核心結論

  1. MySQL 原生不支援事務嵌套
  2. 開啟新事務會隱式提交前一個事務
  3. 僅 InnoDB / BerkeleyDB 支援事務,MyISAM 不支援
  4. 預設 autocommit=1,需顯式 SET autocommit=0 或 START TRANSACTION

二、隱式提交行為驗證

SET autocommit=0;
START TRANSACTION;          -- 事務 A 開始
INSERT INTO t VALUES(1);
START TRANSACTION;          -- 事務 B 開始 → 隱式 COMMIT 事務 A
INSERT INTO t VALUES(2);
ROLLBACK;                   -- 僅回滾事務 B,事務 A 已提交
SELECT * FROM t;            -- 結果:1 存在,2 不存在

三、應用層模擬嵌套計數器模式

框架(如 fastapp)常用 trans_count 計數器模擬嵌套:

class TransactionManager {
    private int transCount = 0;
    private Connection conn;

    public void begin() {
        if (transCount == 0) {
            conn.setAutoCommit(false);  // 真正開啟資料庫事務
        }
        transCount++;
    }

    public void commit() {
        if (transCount <= 0) throw new IllegalStateException();
        transCount--;
        if (transCount == 0) {
            conn.commit();  // 真正提交
            conn.setAutoCommit(true);
        }
    }

    public void rollback() {
        if (transCount <= 0) throw new IllegalStateException();
        transCount = 0;
        conn.rollback();
        conn.setAutoCommit(true);
    }
}

四、最佳實踐與避坑指南

  1. 事務控制必須成對出現:每個 begin() 對應一個 commit() 或 rollback()
  2. 搭配 try-catch 使用:
    try {
        tx.begin();
        // 業務邏輯
        dao.insert(a);
        dao.update(b);
        tx.commit();
    } catch (Exception e) {
        tx.rollback();
        throw e;
    }
  3. 異常處理原則:Catch 區塊只負責回滾,**不要吞掉異常**,向上拋出讓上層決策
  4. 避免在事務中執行 DDL:ALTER TABLE、CREATE INDEX 會隱式提交
  5. 長事務殺手:避免事務中發 RPC、睡眠、大量計算,持有鎖時間過長導致阻塞

五、Savepoint 部分回滾(MySQL 原生支援)

START TRANSACTION;
INSERT INTO t VALUES(1);
SAVEPOINT sp1;
INSERT INTO t VALUES(2);
ROLLBACK TO SAVEPOINT sp1;  -- 僅回滾到 sp1
COMMIT;  -- 僅 1 被提交

可用於單一事務內的階段性回退,但**無法跨事務嵌套**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved