autocommit=1,需顯式 SET autocommit=0 或 START TRANSACTIONSET 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);
}
}
begin() 對應一個 commit() 或 rollback()try {
tx.begin();
// 業務邏輯
dao.insert(a);
dao.update(b);
tx.commit();
} catch (Exception e) {
tx.rollback();
throw e;
}
ALTER TABLE、CREATE INDEX 會隱式提交START TRANSACTION;
INSERT INTO t VALUES(1);
SAVEPOINT sp1;
INSERT INTO t VALUES(2);
ROLLBACK TO SAVEPOINT sp1; -- 僅回滾到 sp1
COMMIT; -- 僅 1 被提交
可用於單一事務內的階段性回退,但**無法跨事務嵌套**。