讀未提交示例操作過程-Read uncommitted
1、打開兩個MySql的命令提示行,均進入相同數據庫,并檢查當前表內容為相同數據如下:
![](/d/20211018/39c1f522fd561780c6c9ed4f9687031a.gif)
2、在A、B兩端執(zhí)行select @@tx_isolation;檢查當前默認的隔離級別別,可以發(fā)現都是
Repeatable Read –可重復讀-(在當前事務內,重復讀取第一次讀取過的數據就叫可重復讀。)
![](/d/20211018/c3a0d13f226d0ba3467d5303a876497c.gif)
3、修改A端的隔離級別為readuncommitted –讀未提交。意思是可以讀取別人沒有提交的數據。
set transactionisolation level read uncommitted;
在綠色的MySql5.5上請執(zhí)行:
Set sessiontransaction isolation level read uncommitted;
然后再查看是否已經發(fā)生改變:
![](/d/20211018/f4f1ba485f44ecff704484bea8b8f510.gif)
4、在A、B兩端都開啟事務
5、在B端修改一行數據如:
update stud setname='Jhon' where id=1;
其后在A端執(zhí)行查詢:select * from stud;
![](/d/20211018/ecaaed83e3619ca0ae3a78122e777544.gif)
6、此時B端再次執(zhí)行回滾操作
Rollback;
再在A端進行查詢,結果發(fā)現數據又回到了之前的數據。這就是臟讀:
![](/d/20211018/77399de1e83aff23e687a92832f9b55e.gif)
7、對于B端寫入的新數據,如果沒有提交A端也一樣能查詢到,這叫幻讀。
![](/d/20211018/18b39c7b55855eda730c561483f47ed9.gif)
讀已提交操作過程:-read COMMITTED
1、 檢查A、B兩端是否一致:
![](/d/20211018/ec41c12997034cbdf5e627d441f7bf48.gif)
2、修改A端(左)的隔離級別為readcommitted;
set transactionisolation level read committed;
在A端開啟事務:
starttransaction;
在B端開啟事務
![](/d/20211018/22baeda5be57f6903ab910b00e0baef0.gif)
3、在A端進行查詢:
在B端修改一行記錄并提交
Update stud setname='itcast' where id=1;
再回到A端進行查詢,發(fā)現在同一個事務內,兩次查詢的結果不一樣:
![](/d/20211018/997a7bc5bf4f46c0690972ccd25b6d00.gif)
可重復讀示例Repeatable Read
1、查看A端的隔離級別是否為Repeatableread級別:
Select@@tx_isolation;
2、先在A端在開啟的事務內進行查詢。
然后在B端修改數據庫的內容。
最后再在A端的同一事務內進行查詢,發(fā)現結果一致。
![](/d/20211018/c4a8fa3d714c3b2cf5bb51dbda044fec.gif)
Serializable是最高級的隔離級別
1、在A端設置隔離級別為Serializable
set transactionisolation level serializable;
在A端開啟一個事務-并對stud表進行查詢。
在B端開啟一個事務,并寫入一行記錄。此時發(fā)現B的代碼并沒有執(zhí)行,因為它在等A提交之后它才執(zhí)行。
類似于線程同步的概念
![](/d/20211018/55707c3bed60f5521e5b503ef2dd2ca9.gif)
這四種隔離級別采取不同的鎖類型來實現,若讀取的是同一個數據的話,就容易發(fā)生問題。例如:
臟讀(Drity Read):某個事務已更新一份數據,另一個事務在此時讀取了同一份數據,由于某些原因,前一個RollBack(回滾)了操作,則后一個事務所讀取的數據就會是不正確的。
不可重復讀(Non-repeatable read):在一個事務的兩次查詢之中數據不一致,這可能是兩次查詢過程中間插入了一個事務更新的原有的數據。
幻讀(Phantom Read):在一個事務的兩次查詢中數據筆數不一致,例如有一個事務查詢了幾列(Row)數據,而另一個事務卻在此時插入了新的幾列數據,先前的事務在接下來的查詢中,就會發(fā)現有幾列數據是它先前所沒有的
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
您可能感興趣的文章:- 深入理解Mysql的四種隔離級別
- MySQL四種事務隔離級別詳解
- 通過實例分析MySQL中的四種事務隔離級別
- Mysql事務隔離級別原理實例解析
- 詳解MySQL中事務隔離級別的實現原理
- mysql隔離級別詳解及示例