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重置連接事物讀寫的代碼在