事務的4個特性和4個隔離級別
- 1. 什么是事務
- 2. 事務的ACID特性
- 2.1 原子性
- 2.2 一致性
- 2.3 持久性
- 2.4 隔離性
- 3. 事務的創建
- 4. 事務并發時出現的問題
- 4.1 DIRTY READ 臟讀
- 4.2 NON - REPEATABLR READ 不可重復讀
- 4.3 PHANTOM READ 幻讀
- 5. 事務的隔離級別
- 5.1 READ UNCOMMITTED 讀未提交
- 5.2 READ COMMITTD 讀已提交
- 5.3 REPEATABLE 可重復讀
- 5.4 SERIALIZABLE 串行化
1. 什么是事務
事務,簡單來說,就是將一組SQL語句組合成一個邏輯單元,這些語句要么全部成功執行,使數據庫狀態發生預期的改變;要么全部失敗,數據庫回滾到事務開始前的狀態,仿佛這組操作從未發生過。
以日常生活中的轉賬場景為例,當A向B轉賬100元時,“A賬戶減少100元”和“B賬戶增加100元”這兩個操作必須作為一個整體來執行,要么都成功完成轉賬,要么因為任何原因(如余額不足、網絡故障等)都不執行,以保證資金的準確性和一致性。這,就是一個典型的事務。

2. 事務的ACID特性
事務之所以能可靠地管理數據,離不開其具有的四大特性:原子性(Atomicity)、一致性(Consistency)、持久性(Durability)和隔離性(Isolation),簡稱為ACID特性。
2.1 原子性
原子性確保事務是一個不可分割的最小工作單元。就像化學反應中的原子一樣,事務中的所有操作要么一起成功,將數據持久化到數據庫;要么一起失敗,數據庫狀態回滾到事務開始之前,不會出現部分操作成功、部分操作失敗的中間狀態。
2.2 一致性
一致性要求事務執行前后,數據庫的完整性約束沒有被破壞,數據必須符合業務邏輯和預先設定的規則。例如,在轉賬事務中,轉賬前后的賬戶總金額應該保持不變,這是保證數據一致性的基本體現。
2.3 持久性
一旦事務被成功提交,其所做的修改就會永久性地保存在數據庫中。即使后續系統發生故障,如硬件損壞、軟件崩潰或斷電等,已提交的數據也不會丟失,確保了數據的可靠性和穩定性。
2.4 隔離性
隔離性使得多個并發事務在執行時,相互之間不會產生干擾,每個事務都像是在獨立運行。不同的隔離級別決定了事務之間的隔離程度,以及可能出現的并發問題,這將在后續詳細討論。
3. 事務的創建
在SQL語言中,我們可以通過以下語句來靈活地控制事務:
-- 開啟一個新的事務,兩種方式均可
START TRANSACTION;
-- 或者
BEGIN;-- 當事務中的所有操作都順利完成,使用此語句提交事務,將修改永久保存到數據庫
COMMIT;-- 如果在事務執行過程中出現錯誤或需要回滾操作,執行此語句取消已執行的所有修改
ROLLBACK;
4. 事務并發時出現的問題
當多個事務同時并發執行時,由于事務之間的相互影響,可能會出現以下幾種常見的問題:
4.1 DIRTY READ 臟讀
臟讀是指一個事務讀取到了另一個事務尚未提交的數據。如果未提交事務隨后回滾,那么讀取到的數據就是無效的,這可能導致數據的不一致和錯誤的業務決策。

4.2 NON - REPEATABLR READ 不可重復讀
不可重復讀是指在同一個事務中,多次讀取同一數據時,由于其他事務在期間對數據進行了修改并提交,導致每次讀取的結果不一致。這會給需要在事務中多次讀取相同數據進行業務處理的場景帶來困擾。

4.3 PHANTOM READ 幻讀
幻讀是指一個事務在執行過程中,發現另一個事務插入了新的數據,導致該事務再次讀取數據時,出現了之前不存在的記錄,仿佛產生了“幻覺”。例如在電商下單場景中,用戶點擊立即購買成功進入下單頁面,準備付款時卻顯示庫存不足,這就是幻讀的一個典型例子。


5. 事務的隔離級別
為了解決事務并發執行時出現的上述問題,數據庫提供了不同的隔離級別,每個隔離級別對并發事務的處理方式和所能避免的問題各不相同。常見的隔離級別有以下4種:
5.1 READ UNCOMMITTED 讀未提交
這是最低的隔離級別,允許一個事務讀取另一個事務尚未提交的數據。由于此級別幾乎沒有任何隔離措施,所以可能會出現臟讀、不可重復讀和幻讀等各種并發問題,在實際應用中較少使用。
5.2 READ COMMITTD 讀已提交
大多數數據庫系統的默認隔離級別。在該級別下,一個事務只能讀取其他事務已經提交的數據,可以有效避免臟讀問題,但仍然可能出現不可重復讀和幻讀。
5.3 REPEATABLE 可重復讀
MySQL的默認隔離級別。在此級別下,同一個事務內多次讀取相同數據時,數據保持一致,能夠避免臟讀和不可重復讀。然而,對于幻讀問題,雖然在一定程度上得到了緩解,但并不能完全杜絕。
5.4 SERIALIZABLE 串行化
這是最高的隔離級別,事務會按照順序依次執行,完全避免了臟讀、不可重復讀和幻讀等所有并發問題。但由于事務串行執行,并發性能較低,適用于對數據一致性要求極高、并發量較低的場景。
通過下面的圖片,可以更直觀地了解不同隔離級別與并發問題之間的關系:

理解事務的概念、特性、操作以及并發問題和隔離級別,對于開發高效、可靠的數據庫應用至關重要。在實際項目中,我們需要根據業務需求和系統性能要求,合理選擇事務的隔離級別,以平衡數據一致性和并發性能之間的關系。