數據庫 事務隔離級別之可重復讀


 

通過下面的sql語句,在sql客戶端查詢可以獲取數據庫的事務隔離級別;

show variables like '%isolation%';

 查看全局事務隔離級別和session事務隔離級別(mysql8)

 select @@global.transaction_isolation, @@transaction_isolation;

mysql8以下 

select @@global.tx_isolation, @@tx_isolation;

 

 mysql默認隔離級別是可重復讀,如下圖:

下面先介紹事務的隔離級別:
可重復讀:在同一事物中不修改數據的情況下, 前后讀取的數據是一致的,且當前事物中在沒有提交的情況下不能讀取其他事物中提交或未提交的數據,下面通過一個例子介紹一下什么叫可重復讀。

我們先在navicat 開啟兩個查詢窗口(后面稱為窗口1,窗口2),一個查詢窗口就是一個會話事務。

我們在1窗口中開啟事務

start TRANSACTION ; 

 然后執行查詢語句

select * from buyer where user_id =1 ;
select * from  buyer where user_id = 2 ; 

 我們發現user1和user2的babancle都是1000 ,然后我們執行給user1減1塊錢,給user2加一塊錢操作。

update buyer set balance = balance-1 where user_id = 1 ;
update buyer set balance = balance+1 where user_id = 2 ;

 然后在窗口1中再次查詢user1和user2的babancle 結果如下:
 user1:

user2:

我們發現在窗口1中查詢到的user1和user2的babancle已經發生了改變。

然后我們打開窗口2, 在窗口2中執行查詢操作。

select * from buyer where user_id =1 ;
select * from  buyer where user_id = 2 ;

 

發現查詢結果還是1000元。

然后在窗口1中執行commit操作,提交窗口1中的轉賬操作。

COMMIT ; 

再次在窗口2中執行查詢操作,發現已經變成更新后的值。

下面解釋為什么會這樣。

 首先窗口1開啟了事物,並且對數據做了修改,但是並沒有執行commit操作,mysql默認的事物隔離級別是 REPEATABLE-READ ,可重復讀,窗口2中不能讀取到窗口1中未提交的數據,所以讀取到的數據依然初始數據。這就是可重復讀。

假如我們在窗口2中開啟事物,執行順序修改為,窗口1開啟事物,窗口2開啟事物,窗口1執行更新操作,窗口1執行commit操作,窗口2執行查詢操作,這時發現,窗口2查到的並不是修改后的數據,而是初始數據,那是因為在在窗口2開啟事物的時候,數據的數據並沒有發生改變,所以在可重復讀隔離級別中。在同一事物中在不修改數據的情況下,前后讀取到的結果應該是一致的。

 

綜上驗證事物隔離級別:可重復讀

總結:可重復讀:在當前事物中,如果不發生修改操作,則在該事物中前后讀取到的數據應該是一致的,且不會讀取到其他事物中提交或未提交的數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM