資料庫交易(Transaction)需要符合 ACID 四個特性,以確保資料的一致性和可靠性。ACID 分別代表:
A - 原子性 (Atomicity)
意義:原子性確保每個交易要麼完全執行,要麼完全不執行。如果交易中的任何一部分操作失敗,整個交易將回滾 (rollback) 到交易開始之前的狀態。這意味著,資料庫不會部分地反映交易操作的結果。
問題:
- 如果未能實現原子性,部分完成的交易會導致資料不一致。例如,在銀行轉帳操作中,若扣款成功但存款失敗,會導致金額不平衡。
C - 一致性 (Consistency)
意義:一致性確保在交易完成後,資料庫必須從一個一致的狀態轉換到另一個一致的狀態。這意味著,所有資料庫的規則(如約束、觸發器等)必須在交易完成後仍然成立。
問題:
- 如果未能保持一致性,資料庫可能會進入不一致的狀態,導致資料完整性被破壞。例如,違反唯一性約束或外鍵約束。
I - 隔離性 (Isolation)
意義:隔離性確保在多個交易同時執行時,彼此之間不會相互干擾。這意味著,每個交易都應該看起來像是獨立執行的,即使它們實際上是並行執行的。
問題:
如果未能實現隔離性,會出現以下問題:
- 髒讀 (Dirty Read):一個交易讀取了另一個未提交的交易所修改的數據,如果後者回滾,前者讀取的數據就會無效。
- 不可重複讀 (Non-Repeatable Read):一個交易在多次讀取同一數據時,若另一個交易在此期間對該數據進行了修改,前者的讀取結果會不一致。
- 幻影讀 (Phantom Read):一個交易在兩次查詢期間,另一個交易插入或刪除了符合條件的數據,導致前者兩次查詢結果不一致。
這些問題會導致數據不一致和邏輯錯誤,破壞數據的完整性和可靠性。
D - 持久性 (Durability)
意義:持久性確保一旦交易提交 (commit),其結果將永久保存到資料庫中,不會因為系統崩潰或其他問題而丟失。這意味著,交易的結果必須被持久化到穩定的儲存中,保證即使在系統故障後也能夠恢復。
問題:
- 如果未能實現持久性,系統崩潰或故障可能導致已提交交易的數據丟失,進而損害資料庫的完整性和可靠性。
總結
ACID 特性是確保資料庫交易正確執行和維護數據完整性的重要基礎。每個特性都針對特定的問題提供解決方案:
- 原子性 (Atomicity) 確保交易要麼全有要麼全無。
- 一致性 (Consistency) 確保交易前後資料庫處於一致狀態。
- 隔離性 (Isolation) 確保並行交易不互相干擾。
- 持久性 (Durability) 確保交易結果永久保存。
特別是隔離性 (Isolation),如果未能解決,會導致髒讀、不可重複讀和幻影讀等問題,從而破壞數據的一致性和正確性。