mysql 只讀事物

MySQL版本: 8 

網上搜了一下mysql的只讀事物,說只讀事物,只能讀取到執行時間點前的內容,事物期間其他事物修改的內容不能讀取到

從mysql執行結果來看上面說的確實是這樣。但這個不能讀取其他事物修改的內容,真的是由只讀來控制的嗎?

其實不然,事物讀取其他事物變更的數據,還是由事物隔離級別來控制的,由於mysql默認的隔離級別是可重複讀(其解決了不可重複讀和幻讀),所以就出現了”只讀事物,只能讀取到執行時間點前的內容,事物期間其他事物修改的內容不能讀取到“這樣的結論。

而mysql的只讀事物只是用來控制當前事物不可進行增刪改。

下面驗證過程:

A客戶端執行如下命令:

# 設置事物只讀

set session transaction read only;

# 設置事物隔離級別爲 讀未提交

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

# 開啓事物

SET autocommit=0;

# 查詢

SELECT * from user;

 

B客戶端執行如下命令:

# 設置事物隔離級別爲 讀未提交

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

# 開啓事物

SET autocommit=0;

# 插入一條數據

INSERT into user (id, name, age) values (99912, "sfds", 90);

回到A客戶端;

# 查詢

SELECT * from user;

 

發現多了一條數據,所以只讀並不能控制數據的變更

#更新

UPDATE user set name = "ssss" where id = 999

 

無法更新,也就是隻讀事物不可增刪改 

 

當連接被設置爲只讀事物後,想要修改爲讀寫事物,在事物提交後,通過如下命令修改:

set session transaction read write

mysql驅動源碼就是這樣做的,

 

如果某個事物是隻讀事物,spring在該事物提交後,會將當前連接重置爲默認的讀寫事物,調用的就是上面的方法,spring重置連接事物讀寫的代碼在

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章