事務是資料庫從「單條 SQL」邁向「業務邏輯單元」的關鍵抽象。本文深入解析 ACID 四大特性在 InnoDB 中的實現機制、隔離級別對一致性的影響、COMMIT/ROLLBACK 交互模式、自動提交陷阱與分佈式事務擴展。
| 特性 | InnoDB 實現機制 | 關鍵參數/結構 |
|---|---|---|
| Atomicity 原子性 | Undo Log 記錄反向操作,Crash Recovery 時回滾未提交事務 | innodb_undo_tablespaces, innodb_undo_logs |
| Consistency 一致性 | 約束(PK/FK/Check/Trigger)+ 隔離性 + 原子性 共同保證 | 應用層業務邏輯為核心 |
| Isolation 隔離性 | MVCC + 鎖(Record/Gap/Next-Key)實現四級隔離 | transaction_isolation, innodb_locks_unsafe_for_binlog |
| Durability 持久性 | Redo Log (WAL) + Doublewrite Buffer + fsync | innodb_flush_log_at_trx_commit, sync_binlog |
-- 顯式事務 START TRANSACTION; -- 或 BEGIN / BEGIN WORK SELECT ... FOR UPDATE; -- 鎖定讀 UPDATE ...; INSERT ...; COMMIT; -- 或 ROLLBACK; -- 儲存點(部分回滾) SAVEPOINT sp1; UPDATE ...; ROLLBACK TO SAVEPOINT sp1; -- 僅回滾到 sp1 RELEASE SAVEPOINT sp1;
-- 查看/設定 SELECT @@autocommit; -- 1=開啟(預設), 0=關閉 SET autocommit = 0; -- 當前會話關閉,需顯式 COMMIT SET autocommit = 1; -- 開啟,每條 SQL 隱式提交
⚠️ 連線池陷阱:連線歸還池中時若未COMMIT/ROLLBACK,下一個借用者將繼承未提交事務,導致資料不一致或鎖爭用。務必在連線池reset回調中執行ROLLBACK。
| 級別 | 髒讀 | 不可重複讀 | 幻讀 | InnoDB 實現 | 建議場景 |
|---|---|---|---|---|---|
| READ UNCOMMITTED | ✅ | ✅ | ✅ | 無鎖讀最新版本 | 近似統計、監控大屏 |
| READ COMMITTED | ❌ | ✅ | ✅ | 語句級 Read View + 行鎖 | 高併發 OLTP(推薦預設) |
| REPEATABLE READ | ❌ | ❌ | ❌* (Next-Key Lock) | 事務級 Read View + Gap Lock | 需可重複讀語義的報表/對帳 |
| SERIALIZABLE | ❌ | ❌ | ❌ | 全部 SELECT 加共享鎖 | 極少用,嚴重影響併發 |
* RR 下靠 Next-Key Lock 防幻讀,但大範圍掃描會鎖大量間隙,併發急劇下降。
-- XA 事務流程 XA START 'xid_123'; UPDATE account SET balance = balance - 100 WHERE id = 1; UPDATE account SET balance = balance + 100 WHERE id = 2; XA END 'xid_123'; XA PREPARE 'xid_123'; -- 階段 1:寫入 prepare 狀態,持久化 redo/undo -- 協調器收集所有參與者 PREPARE 成功後 XA COMMIT 'xid_123'; -- 階段 2:提交 -- 或 XA ROLLBACK 'xid_123';
innodb_support_xa=ON(預設開啟),二進制日誌環境必須開啟 否則主從數據不一致。ERROR 1213 (HY000),指數退避重試 3 次;監控 Innodb_deadlocks 指標。SELECT * FROM information_schema.innodb_trx WHERE trx_started < NOW() - INTERVAL 60 SECOND; 告警並 Kill。SET TRANSACTION READ ONLY 或 START TRANSACTION READ ONLY,InnoDB 分配較小 Read View,不分配事務 ID,減少 Undo 壓力。事務不是萬能藥,濫用會拖垮效能;但掌握其核心機制,能在「正確性」與「效能」間找到最佳平衡點。