標籤:
轉自:http://793404905.blog.51cto.com/6179428/1615550
本文通過執行個體展示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)隔離等級。關於隔離等級的其他知識點以及更細微的介紹,本文不做過多介紹,僅僅介紹基本的概念和理解,如果有興趣的夥伴,可以考慮按照我這種模式,不斷實驗。
MySQL之交易隔離等級--轉載