事務的 ACID 特性詳解
數據庫中的 事務(Transaction) 是一組操作的集合,這些操作要么全部執行,要么全部不執行。為了保證事務可靠執行,必須滿足 ACID 四大特性:
特性 | 英文縮寫 | 簡要說明 |
---|---|---|
原子性 | Atomicity | 事務是一個完整的單位,要么全做,要么全不做 |
一致性 | Consistency | 事務執行前后,數據都必須保持一致性(遵循約束) |
隔離性 | Isolation | 多個事務并發執行時,互不干擾 |
持久性 | Durability | 事務一旦提交,對數據的修改是永久性的,即使崩潰也不會丟失 |
1?? 原子性(Atomicity)
要么全做,要么全不做
- 比喻:ATM 轉賬,錢扣了沒到賬,這是原子性問題。
- 舉例:
如果中間一條失敗了,必須回滾之前操作。BEGIN; UPDATE account SET money = money - 100 WHERE id = 1; UPDATE account SET money = money + 100 WHERE id = 2; COMMIT;
2?? 一致性(Consistency)
事務前后數據必須滿足所有數據庫約束,保持合法狀態
-
比喻:賬目不能多出來或少掉錢
-
舉例:
- 轉賬前:賬戶1有500元,賬戶2有300元,總額800元
- 轉賬100后,總額仍為800元
如果執行后總金額變成900元或700元,就違反一致性。
3?? 隔離性(Isolation)
多個事務并發執行時,互不干擾
- 舉例:兩個事務同時修改同一條商品庫存,如果不加隔離機制,可能導致超賣。
隔離級別 | 說明 | 問題防止 |
---|---|---|
Read Uncommitted | 可以讀到未提交的數據 | 會臟讀 ? |
Read Committed | 只能讀到已提交的數據 | 防臟讀 ? |
Repeatable Read | 一次事務中多次讀取結果一致 | 防臟讀+不可重復讀 ? |
Serializable | 嚴格串行執行,事務一個個來 | 最安全,防幻讀 ? |
4?? 持久性(Durability)
事務提交后,對數據的修改永久生效,即使斷電、系統崩潰也不會丟失
- 舉例:你提交了訂單,系統突然宕機,重啟后訂單還在。
- 實現依賴:WAL 日志機制(Write Ahead Logging,先寫日志再寫磁盤)
WAL:寫前日志(Write-Ahead Logging)
在對數據進行修改之前,先把修改的“意圖”記錄到日志中,再去真正修改數據頁。
關鍵原則:
日志先行,數據后寫;日志落盤,事務才算提交成功。
這個日志通常寫在一個順序 I/O 的文件里,寫入快、穩定。
記憶小技巧(ACID)
字母 | 含義 | 關鍵詞(助記) |
---|---|---|
A | Atomicity | 原子炸彈:要么爆炸全部,要么不炸 |
C | Consistency | 規則一致:前后一致,邏輯正確 |
I | Isolation | 互相隔離:像獨立房間互不干擾 |
D | Durability | 寫進石頭里:一旦提交,永不丟失 |
https://github.com/0voice