事務是數據庫區別於文件系統的核心特性,保證數據在並發、故障場景下的正確性。本文從 ATM 取款場景切入,系統講解 ACID 四大特性、五種事務類型(扁平/帶保存點/鏈/嵌套/分布式)、隔離級別與鎖機制,並給出 MySQL 實戰最佳實踐。
取款 7 步驟:驗證密碼 → 查余額 → 用戶輸入金額 → 扣減賬戶余額 → 吐鈔 → 用戶取走鈔。
若第 5 步「扣減成功」但第 6 步「吐鈔失敗」,用戶錢少了、銀行多了,嚴重違背業務不變量。
事務解決方案:7 步要麼全成功,要麼全回滾,不存在中間狀態。
| 特性 | 英文 | 核心含義 | MySQL 實現機制 |
|---|---|---|---|
| 原子性 | Atomicity | 事務不可分割,全做或全不做 | Undo Log 回滾段 |
| 一致性 | Consistency | 事務前後數據庫完整性約束不被破壞 | 約束檢查 + 原子性/隔離性/持久性共同保證 |
| 隔離性 | Isolation | 並發事務互不干擾,可串行化 | MVCC + 行鎖 + Gap Lock + Next-Key Lock |
| 持久性 | Durability | 提交後永久生效,崩潰可恢復 | Redo Log (WAL) + Doublewrite Buffer + fsync |
BEGIN ... COMMIT/ROLLBACK,單層級,不支援部分提交/回滾。SAVEPOINT sp1; ROLLBACK TO sp1; 允許回滾到中間狀態,適用於長流程業務(如多段式出行)。XA START/END/PREPARE/COMMIT/ROLLBACK。| 隔離級別 | 髒讀 | 不可重複讀 | 幻讀 | MySQL 默認 |
|---|---|---|---|---|
| READ UNCOMMITTED | ✓ | ✓ | ✓ | |
| READ COMMITTED | ✗ | ✓ | ✓ | |
| REPEATABLE READ | ✗ | ✗ | ✗ (MVCC+Gap Lock) | ✓ |
| SERIALIZABLE | ✗ | ✗ | ✗ |
建議:生產環境多用 REPEATABLE READ(RR),配合 SELECT ... FOR UPDATE / LOCK IN SHARE MODE 解決特定並發衝突;高一致性場景可升級 SERIALIZABLE(性能代價大)。
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED 適合高併發讀多寫少場景。1213 錯誤碼重試。Innodb_trx_id 歷史長度、Innodb_row_lock_waits、Innodb_deadlocks、活躍事務數。事務是數據庫可靠性的基石。理解 ACID 底層機制、掌握隔離級別權衡、識別長事務與分布式事務風險,是架構高可用、高併發系統的必修課。MySQL InnoDB 通過 MVCC + Redo/Undo Log + 鎖體系,在性能與一致性間實現了工程上的最佳平衡。