ACID
ACID 是資料庫交易的四個基本特性,確保資料的可靠性與一致性。

Transaction(交易)
所謂的資料庫交易,可以理解成一系列對資料庫的讀取和寫入操作。所有的操作都要能正常運行(在程式中使用事務來包裹需要保證一致性的操作),交易才能提交;如果中間有任何的操作失敗,就會要把所有的操作都回滾。
Atomicity(原子性)
指一個交易中的操作,要不全部完成,要不全部失敗。
Consistency(一致性)
事務對資料庫的修改必須使資料庫從一個一致性狀態轉變到另一個一致性狀態。
Isolation(隔離性)
交易之間的隔離程度,共有四個隔離等級:
| 隔離等級 | 說明 |
|---|---|
| Read Uncommitted | 讀未提交 |
| Read Committed | 讀已提交 |
| Repeatable Read | 可重複讀 |
| Serializable | 序列化 |
Read Uncommitted
- 特性:交易可以讀取其他交易尚未提交的數據
- 防止問題:無
- 可能問題:髒讀(Dirty Read)
- 適用情境:
- 很少用,因為容易出現數據不一致問題
- 數據一致性最低,但效能最好
- 當效能遠大於資料正確時,可能會使用這個隔離層級
Read Committed
- 特性:只能讀取已經提交的數據
- 防止問題:髒讀
- 可能問題:不可重複讀取(Non-Repeatable Read)
- 適用情境:提供了較好的效能和資料一致性平衡,適用於大多數讀取操作多於寫入操作的應用場景
Repeatable Read
MySQL 預設的隔離等級
在 InnoDB 儲存引擎中,透過間隙鎖定(Gap Lock)機制來防止幻讀,但在某些情況下可能仍存在幻讀問題。提供了良好的資料一致性,適用於大多數應用場景。
- 特性:要求同一個交易(Transaction)裡面多次
SELECT資料需要一致
Serializable
- 特性:最高的隔離級別,透過強制事務依序執行,只能讀取已經提交的數據
- 防止問題:完全防止髒讀、不可重複讀取和幻讀
- 適用情境:
- 讀寫不互相干擾 / 多個事務同時執行時,每個事務的操作應該互不影響
- 效能最低,因為它基本上會鎖定讀取的資料行和相鄰的間隙,導致並發性降低
- 適用於要求極高資料一致性的應用場景,如金融交易系統
Serializable 範例:
| Time | Transaction A | Transaction B |
|---|---|---|
| T0 | SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; | SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; |
| T1 | BEGIN; | BEGIN; |
| T2 | SELECT * FROM employees WHERE id = 1 FOR UPDATE; | |
| T3 | UPDATE employees SET salary = 6666.00 WHERE id = 1 FOR UPDATE; (會阻塞) | |
| T4 | UPDATE employees SET salary = 33333.00 WHERE id = 1; | |
| T5 | COMMIT; | |
| T6 | UPDATE employees SET salary = 99999.00 WHERE id = 1; | |
| T7 | COMMIT; |
Durability(持久性)
數據永久性,一旦交易提交,其結果就是永久性的,即使系統發生故障也不會丟失。