標籤:mysql 隔離等級
本文通過執行個體展示MySQL事務的四種隔離等級。
1 概念闡述
1)Read Uncommitted(讀未提交)
其他事務的在未提交的改動下,當前事務可以察覺。
2)Read Committed(讀提交)
其他事務在提交改動之後,當前事務可以察覺,如果其他事務未提交改動,那麼不會察覺。
3) Repeatable Read(可重複讀)
其他事務提交了改動,並且當前事務也提交的操作,之後才可以察覺改動。
4) Serializable(可序列化的)
通過加鎖方式,僅僅保持一個事務執行更新操作,如果其他事務執行更行操作,那麼將處於阻塞
等待狀態。
2 執行個體展示
2.1 如何查詢當前MySQL的交易隔離等級
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/59/EC/wKiom1TvJ2WQCFt8AABVdQZ4GFY290.jpg" title="1.png" alt="wKiom1TvJ2WQCFt8AABVdQZ4GFY290.jpg" />
MySQL預設隔離等級是Repeatable Read(可重複讀)
2.2 設定當前會話的隔離等級
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/59/E8/wKioL1TvKOajzNsVAACMvJlRaf0017.jpg" title="2.png" alt="wKioL1TvKOajzNsVAACMvJlRaf0017.jpg" />
2.3 Read Uncommitted 隔離等級效果展示
1.A,B兩個事務,將A事務設定為Read Uncommitted交易隔離等級,當B事務,做修改後未提交,A事務可以發現B事務的修改內容。
2.當A事務修改某條記錄時,B也修改某條記錄,會出現B阻塞等待現象,也就是說A事務修改會具有行級鎖。
(A事務)
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/59/E8/wKioL1TvKeig7TBNAAB07h7ZgbM307.jpg" title="3.png" alt="wKioL1TvKeig7TBNAAB07h7ZgbM307.jpg" />
(B事務修改資料,但不提交)
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/59/EC/wKiom1TvKV3hzouWAAB2dVI43Aw543.jpg" title="4.png" alt="wKiom1TvKV3hzouWAAB2dVI43Aw543.jpg" />
(A事務可以察覺B事務修改的資料)
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/59/E8/wKioL1TvKrvyDmgGAABTY5qDLK4715.jpg" title="5.png" alt="wKioL1TvKrvyDmgGAABTY5qDLK4715.jpg" />
從上述過程可以發現,在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事務)
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/59/EC/wKiom1TvK_egT9DbAAEIfN30WuA213.jpg" title="6.png" alt="wKiom1TvK_egT9DbAAEIfN30WuA213.jpg" />
(B事務更新但未提交)
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/59/EC/wKiom1TvLsHDfe1JAAD1XJiQr0Q763.jpg" title="7.png" alt="wKiom1TvLsHDfe1JAAD1XJiQr0Q763.jpg" />
(B事務提交後,A事務可以發現B的修改)
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/59/E9/wKioL1TvMGmBzRwRAABulsgCVNs281.jpg" title="8.png" alt="wKioL1TvMGmBzRwRAABulsgCVNs281.jpg" />
2.5 Repeatable Read(可重複讀)
1. A、B事務,A事務為Repeatable Read,當事務B修改後提交,A仍然無法察覺B的修改效果,而當A事務也提交之後,才可以察覺B的修改。
2. 同樣存在行級鎖的鎖定
(A事務)
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/59/E9/wKioL1TvMoChe1RsAAEVqDAu61k018.jpg" title="9.png" alt="wKioL1TvMoChe1RsAAEVqDAu61k018.jpg" />
(B事務修改並提交,A事務仍然無法發覺B的修改)
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/59/EC/wKiom1TvMhbRxZ8kAAD6h5mOlP0808.jpg" title="10.png" alt="wKiom1TvMhbRxZ8kAAD6h5mOlP0808.jpg" />
(A事務也提交後,可以發現B的修改)
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/59/E9/wKioL1TvM2nTh0QqAABk-DkaAZo083.jpg" title="11.png" alt="wKioL1TvM2nTh0QqAABk-DkaAZo083.jpg" />
2.6 Serializable(可序列化的)
1. A、B事務,A事務為Serializable,那麼B不能執行任何更新操作,因為A會擷取表級鎖,使得其他事務無法訪問。
(A事務)
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/59/E9/wKioL1TvNGXg4VVHAAEUMvbkZGI922.jpg" title="12.png" alt="wKioL1TvNGXg4VVHAAEUMvbkZGI922.jpg" />
(B事務修改操作,無法執行)
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/59/EC/wKiom1TvNAWwNYuUAADdcbyu4dw303.jpg" title="13.png" alt="wKiom1TvNAWwNYuUAADdcbyu4dw303.jpg" />
3 總結
在MySQL中預設採用可重複讀(Repeatable Read)隔離等級。關於隔離等級的其他知識點以及更細微的介紹,本文不做過多介紹,僅僅介紹基本的概念和理解,如果有興趣的夥伴,可以考慮按照我這種模式,不斷實驗。
本文出自 “java程式冥” 部落格,請務必保留此出處http://793404905.blog.51cto.com/6179428/1615550
【MySQL之交易隔離等級】