MySQL篇(四)事務相關知識詳解
- MySQL篇(四)事務相關知識詳解
- 一、事務的特性(ACID)
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔離性(Isolation)
- 持久性(Durability)
- 二、并發事務帶來的問題
- 臟讀(Dirty Read)
- 不可重復讀(Non - repeatable Read)
- 幻讀(Phantom Read)
- 三、解決并發事務問題的方法
- 讀未提交(Read Uncommitted)
- 讀已提交(Read Committed)
- 可重復讀(Repeatable Read)
- 串行化(Serializable)
- 四、MySQL的默認隔離級別
- 五、undo log和redo log的區別
- undo log
- redo log
- 六、MySQL中的MVCC(多版本并發控制)
MySQL篇(四)事務相關知識詳解
一、事務的特性(ACID)
原子性(Atomicity)
原子性是指事務是一個不可分割的工作單位,事務中的操作要么全部執行,要么全部不執行。比如在銀行轉賬中,從一個賬戶扣款和向另一個賬戶存款這兩個操作必須同時成功或者同時失敗,不能只執行其中一個操作 ,確保了數據的完整性和一致性。
一致性(Consistency)
一致性是指事務執行前后,數據庫的完整性約束沒有被破壞 。例如轉賬前后,兩個賬戶的總金額應該保持不變。它關注的是業務邏輯上的正確性,通過原子性、隔離性和持久性來保證。
隔離性(Isolation)
隔離性是指多個事務并發執行時,一個事務的執行不能被其他事務干擾。不同的隔離級別決定了事務之間相互干擾的程度,比如在高并發場景下,多個事務同時操作相同數據時,隔離性可以防止數據出現臟讀、不可重復讀、幻讀等問題。
持久性(Durability)
持久性是指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的,接下來的其他操作或故障不應該對其執行結果有任何影響 。例如轉賬成功提交事務后,即使系統崩潰,轉賬的結果依然存在。
二、并發事務帶來的問題
臟讀(Dirty Read)
一個事務讀取到了另一個事務尚未提交的數據。比如事務A修改了某條記錄但未提交,此時事務B讀取了這條被修改但未提交的記錄,如果事務A回滾,事務B讀取到的數據就是無效的臟數據。
不可重復讀(Non - repeatable Read)
在一個事務內多次讀取同一數據時,由于其他事務對該數據進行了修改并提交,導致在本事務中多次讀取的數據不一致。例如事務A讀取某條記錄,然后事務B修改并提交了這條記錄,事務A再次讀取時得到了不同的值。
幻讀(Phantom Read)
在一個事務中執行查詢操作,在事務執行過程中,由于其他事務插入了新的數據,當該事務再次執行相同的查詢時,結果集發生了變化,就好像產生了“幻影”數據。比如事務A查詢符合某條件的記錄,事務B插入了符合該條件的新記錄并提交,事務A再次查詢時就會發現多了一些記錄。
三、解決并發事務問題的方法
通過設置不同的事務隔離級別來解決并發事務問題:
讀未提交(Read Uncommitted)
最低的隔離級別,允許讀取未提交的數據,會導致臟讀、不可重復讀和幻讀問題,一般很少使用。
讀已提交(Read Committed)
一個事務只能讀取其他事務已經提交的數據。可以避免臟讀,但仍然可能出現不可重復讀和幻讀問題,是大多數數據庫的默認隔離級別(MySQL默認不是這個 )。
可重復讀(Repeatable Read)
在一個事務內的多次讀取操作會返回相同的數據,即使其他事務對數據進行了修改并提交。可以避免臟讀和不可重復讀,但在某些情況下仍可能存在幻讀問題。MySQL的默認隔離級別是可重復讀,通過MVCC(多版本并發控制)機制在一定程度上解決了幻讀問題。
串行化(Serializable)
最高的隔離級別,事務會按照順序依次執行,就像單線程環境一樣,能避免臟讀、不可重復讀和幻讀的所有問題,但并發性能較差。
四、MySQL的默認隔離級別
MySQL的默認隔離級別是可重復讀(Repeatable Read) 。在這種隔離級別下,MySQL通過MVCC機制來實現事務的并發控制。MVCC為每個事務維護一個一致性視圖,事務在讀取數據時,根據這個視圖來判斷數據的可見性,從而在保證數據一致性的同時提高并發性能。
五、undo log和redo log的區別
undo log
undo log主要用于事務的回滾操作。當事務執行過程中需要回滾時,undo log可以記錄數據修改前的版本信息,通過這些信息將數據恢復到事務開始前的狀態。同時,undo log在MVCC機制中也起到重要作用,用于構建一致性視圖,提供舊版本數據的可見性判斷依據。
redo log
redo log主要用于保障事務的持久性。在事務提交時,先將事務的修改操作記錄到redo log中,然后再將數據真正寫入磁盤。當數據庫發生崩潰恢復時,可以根據redo log中的記錄將數據恢復到事務提交后的狀態,確保已提交事務的數據不會丟失。
六、MySQL中的MVCC(多版本并發控制)
MVCC是一種用于實現數據庫并發控制的機制,它通過為數據庫中的每行數據維護多個版本來實現事務的并發執行。在MySQL的InnoDB存儲引擎中:
- 實現原理:MVCC為每行數據記錄多個版本,每個版本包含事務ID等信息。當事務讀取數據時,根據事務的開始時間戳和數據版本的事務ID來判斷數據是否可見。如果數據版本的事務ID小于當前事務的開始時間戳,那么該版本數據對當前事務可見;否則不可見。
- 作用:MVCC可以在不使用鎖(或減少鎖的使用)的情況下,實現事務的并發讀取,提高了數據庫的并發性能,同時在可重復讀隔離級別下,配合undo log有效解決了臟讀、不可重復讀問題,并在一定程度上緩解了幻讀問題。