事務的四大特性(ACID)詳解
在數據庫管理系統(如 MySQL)中,事務(Transaction) 是指一組要么全部執行、要么全部不執行的數據庫操作,通常用于確保數據的完整性和一致性。事務有四大核心特性,即 ACID,分別是:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。
作用:
事務的 ACID 四大特性是數據庫系統用來確保數據完整性、正確性和并發一致性的核心機制。通過日志、事務隔離級別、數據庫約束等手段,數據庫可以有效解決數據一致性問題和并發問題,為數據的可靠性保駕護航。
ACID 四大特性
特性 | 英文名稱 | 定義 | 常見問題及解決方法 |
---|---|---|---|
原子性 | Atomicity | 事務中的所有操作要么全部成功,要么全部失敗并回滾。 | 通過事務日志(Undo Log)和回滾機制實現 |
一致性 | Consistency | 事務執行前后,數據庫保持一致性,滿足完整性約束。 | 通過數據庫約束、觸發器、日志來維護一致性 |
隔離性 | Isolation | 多個事務并發時,相互隔離,防止臟讀、不可重復讀等問題。 | 通過事務隔離級別(如可重復讀、可序列化等)解決并發問題 |
持久性 | Durability | 事務一旦提交,修改將永久保存,即使系統故障也不會丟失。 | 通過事務日志(Redo Log)、備份機制實現 |
1. 原子性(Atomicity)
定義:
原子性是指事務中的所有操作被視為一個整體,要么全部執行成功,要么全部失敗并回滾(rollback),不能只執行部分操作。
如果事務在執行過程中發生錯誤或出現故障,數據庫系統會將其恢復到事務開始之前的狀態,保證數據不會被部分更新。
舉例:
銀行轉賬操作:從用戶A的賬戶轉出100元并轉入用戶B的賬戶。如果只有扣款成功,而轉賬失敗,就會導致數據不一致。而原子性確保要么兩步都成功,要么兩步都不執行,保證事務的完整性。
實現方式:
通過 回滾機制(Rollback) 和 日志(Undo Log) 來實現。
2. 一致性(Consistency)
定義:
一致性是指事務執行前后,數據庫必須處于一致的狀態。
也就是說,事務執行后,數據要滿足數據庫的完整性約束(如主鍵約束、外鍵約束、唯一性約束等)。
舉例:
假設有一個規則要求:銀行所有賬戶的總余額應該保持不變。如果在用戶A和用戶B之間轉賬后,數據庫中總余額仍然等于事務執行前的總余額,就表示事務保持了一致性。
實現方式:
通過 數據庫約束(如外鍵、觸發器)、事務日志和回滾機制 來維護一致性。
3. 隔離性(Isolation)
定義:
隔離性是指當多個事務并發執行時,一個事務的執行不應受到其他事務的影響,各事務之間相互隔離,防止并發問題(如臟讀、不可重復讀、幻讀)。
并發問題及其含義:
- 臟讀(Dirty Read): 一個事務讀取了另一個事務未提交的數據。
- 不可重復讀(Non-repeatable Read): 在同一事務中,兩次讀取的同一數據結果不一致,因其他事務修改了該數據。
- 幻讀(Phantom Read): 一個事務讀取了數據集合,另一個事務在集合中插入了新數據,導致前一個事務在再次讀取時“看到”新的數據,仿佛出現了幻影。
解決方法(隔離級別):
SQL 標準定義了四種事務隔離級別,從低到高依次為:
- 讀未提交(Read Uncommitted): 允許臟讀、不可重復讀、幻讀。
- 讀已提交(Read Committed): 不允許臟讀,但可能出現不可重復讀和幻讀。
- 可重復讀(Repeatable Read): 禁止臟讀和不可重復讀,但可能出現幻讀(MySQL 默認級別)。
- 可序列化(Serializable): 提供最高隔離級別,完全防止上述問題,但降低并發性能。
4. 持久性(Durability)
定義:
持久性是指事務一旦提交,所做的修改將永久保存在數據庫中,即使系統發生故障(如斷電、宕機),數據也不會丟失。
舉例:
當用戶完成一筆銀行轉賬并提交事務后,即使系統宕機,轉賬結果也會永久保存到數據庫中。
實現方式:
通過 事務日志(Redo Log)、數據庫寫盤機制 和 備份機制 來保證事務的持久性。即使發生意外故障,數據庫可以通過日志來恢復提交的事務。
事務執行過程(一般步驟):
- 開啟事務:
START TRANSACTION;
- 執行事務操作:如插入、更新或刪除操作。
UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2;
- 提交事務(提交數據并永久保存):
COMMIT;
- 回滾事務(若發生錯誤,撤銷事務中的所有操作):
ROLLBACK;