MYSQL事务隔离级别详解附加实验
參考:
https://dev.mysql.com/doc/refman/5.7/en/set-transaction.html
http://xm-king.iteye.com/blog/770721
1.事務介紹
1.1 4種事務介紹
Read Uncommitted(讀取未提交內容)
?????? 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用于實際應用,因為它的性能也不比其他級別好多少。讀取未提交的數據,也被稱之為臟讀(Dirty Read)。
Read Committed(讀取提交內容)
?????? 這是大多數數據庫系統的默認隔離級別(但不是MySQL默認的)。它滿足了隔離的簡單定義:一個事務只能看見已經提交事務所做的改變。這種隔離級別 也支持所謂的不可重復讀(Nonrepeatable Read),因為同一事務的其他實例在該實例處理其間可能會有新的commit,所以同一select可能返回不同結果。
Repeatable Read(可重讀)
?????? 這是MySQL的默認事務隔離級別,它確保同一事務的多個實例在并發讀取數據時,會看到同樣的數據行。不過理論上,這會導致另一個棘手的問題:幻讀 (Phantom Read)。簡單的說,幻讀指當用戶讀取某一范圍的數據行時,另一個事務又在該范圍內插入了新行,當用戶再讀取該范圍的數據行時,會發現有新的“幻影” 行。InnoDB和Falcon存儲引擎通過多版本并發控制(MVCC,Multiversion Concurrency Control)機制解決了該問題。
Serializable(可串行化)
?????? 這是最高的隔離級別,它通過強制事務排序,使之不可能相互沖突,從而解決幻讀問題。簡言之,它是在每個讀的數據行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。
這四種隔離級別采取不同的鎖類型來實現,若讀取的是同一個數據的話,常常容易出現的問題如下:
- 臟讀(Drity Read):某個事務已更新一份數據,另一個事務在此時讀取了同一份數據,由于某些原因,前一個RollBack了操作,則后一個事務所讀取的數據就會是不正確的。
- 不可重復讀(Non-repeatable read):在一個事務的兩次查詢之中數據不一致,這可能是兩次查詢過程中間插入了一個事務更新的原有的數據。
- 幻讀(Phantom Read):在一個事務的兩次查詢中數據筆數不一致,例如有一個事務查詢了幾列(Row)數據,而另一個事務卻在此時插入了新的幾列數據,先前的事務在接下來的查詢中,就會發現有幾列數據是它先前所沒有的。
2.1實驗環境設置
我們這里使用了xshell遠程連接linux服務器。 啟動了SessionA , SessionB 2個mysql會話。如下圖所示。
2.2插入樣例數據
2.3測試Read UnCommitted(讀取未提交內容)
2.3.1讀臟數據、不可重復讀、幻影讀三者一起測試。
2.4測試Read Committed(讀取提交內容)
2.4.1讀臟數據測試
2.42不可重復讀、幻影讀三者一起測試。
2.5測試REPEATABLE-READ(可重復讀)
2.5.1臟讀和不可重復度一起測試
?
2.5.2幻影讀測試
2.6測試可串行化 (Serializable)
?2.6.1讀臟數據測試
2.6.2不可重復讀測試,同上一樣, 阻塞,保證可以重讀讀數據
2.6.3幻影讀測試,同上一樣, 阻塞, 保證不會出現幻影讀問題。
總結:
?
轉載于:https://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_mysql_001.html
總結
以上是生活随笔為你收集整理的MYSQL事务隔离级别详解附加实验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第一个程序实现登录功能,密码输错三次封账
- 下一篇: DB2客户端,查看、增加、删除节点和数据