本文通過實例展示MySQL事務的四種隔離級別。
1 概念闡述
1)Read Uncommitted(讀未提交)
其他事務的在未提交的改動下,當前事務可以察覺。
2)Read Committed(讀提交)
其他事務在提交改動之後,當前事務可以察覺,如果其他事務未提交改動,那麼不會察覺。
3) Repeatable Read(可重複讀)
其他事務提交了改動,並且當前事務也提交的操作,之後纔可以察覺改動。
4) Serializable(可串行化的)
通過加鎖方式,僅僅保持一個事務執行更新操作,如果其他事務執行更行操作,那麼將處於阻塞
等待狀態。
2 實例展示
2.1 如何查詢當前MySQL的事務隔離級別
MySQL默認隔離級別是Repeatable Read(可重複讀)
2.2 設置當前會話的隔離級別
2.3 Read Uncommitted 隔離級別效果展示
1.A,B兩個事務,將A事務設置爲Read Uncommitted事務隔離級別,當B事務,做修改後未提交,A事務可以發現B事務的修改內容。
2.當A事務修改某條記錄時,B也修改某條記錄,會出現B阻塞等待現象,也就是說A事務修改會具有行級鎖。
(A事務)
(B事務修改數據,但不提交)
(A事務可以察覺B事務修改的數據)
從上述過程可以發現,在Read Uncommitted隔離級別下,事務之間的修改會相互察覺,因此容易出現髒讀現象。
而且此時事務A:update counter set value=1002 where id=1,但不提交事務;事務B也執行update counter set value = 1004 where id = 1;會阻塞等待直到超時。原因是因爲事務A執行時,鎖住了id=1的這行記錄,因此其他事務必須等待處理完畢再執行;但是其他事務可以處理id!=1的記錄。
2.4 Read Committed 隔離級別效果展示
1. A、B兩個事務,假設A事務的隔離級別爲Read Committed,那麼B事務在執行commit之後,A事務可以發現B的修改。
2. 與Read UnCommitted一樣,都存在行級鎖的現象。
(A事務)
(B事務更新但未提交)
(B事務提交後,A事務可以發現B的修改)
2.5 Repeatable Read(可重複讀)
1. A、B事務,A事務爲Repeatable Read,當事務B修改後提交,A仍然無法察覺B的修改效果,而當A事務也提交之後,纔可以察覺B的修改。
2. 同樣存在行級鎖的鎖定
(A事務)
(B事務修改並提交,A事務仍然無法發覺B的修改)
(A事務也提交後,可以發現B的修改)
2.6 Serializable(可串行化的)
1. A、B事務,A事務爲Serializable,那麼B不能執行任何更新操作,因爲A會獲取表級鎖,使得其他事務無法訪問。
(A事務)
(B事務修改操作,無法執行)
3 總結
在MySQL中默認採用可重複讀(Repeatable Read)隔離級別。關於隔離級別的其他知識點以及更細微的介紹,本文不做過多介紹,僅僅介紹基本的概念和理解,如果有興趣的夥伴,可以考慮按照我這種模式,不斷實驗。