//檢視隔離級別
select @@global.tx_isolation,@@tx_isolation;
select @@global.transaction_isolation,@@transaction_isolation;//mysql8
//設定隔離級別為可重複讀
set global tx_isolation='repeatable-read';
set session tx_isolation='repeatable-read';
測試結果(mysql 8;innodb引擎):
事務a事務b
#repeatable-read 幻讀演示
begin;#1
insert into test(a,b) values (1,2);#4
select * from test;#5 三條結果
commit;#7
select * from test;#8 三條結果
#repeatable-read 幻讀演示(不會讀到其它事務插入資料,沒有發生幻讀)
begin;#2
select * from test;#3 兩條結果
select * from test;#6 兩條結果
select * from test;#9 兩條結果
commit;#10 end
select * from test;#11 三條結果
#repeatable-read 幻讀演示
begin;#1
select * from test;#3 三條資料,id=4的不存在
insert into test(id,a,b) values (4, 1,2); #4,插入id=4
commit;#6
#repeatable-read 幻讀演示(沒有讀到,但是插入會報錯)
begin;#2
select * from test;#3 三條資料,id=4的不存在
select * from test;#5 三條資料,id=4的不存在,但其它事務已插入
select * from test;#7 三條資料,id=4的不存在,但其它事務已插入,且提交
insert into test(id,a,b) values (4, 1,2);#8 插入失敗,id=4衝突
select * from test;#8 三條資料,id=4的不存在
commit;#9 end
select * from test;#110 四條結果
#repeatable-read 幻讀演示
begin;#1
select * from test;#3 id=7的不存在
insert into test(id,a,b) values (7, 1,2); #4,插入id=7
commit;#5
select * from test;#8 id=7的存在,且b=2
select * from test;#10 id=7的存在,且b=999
#repeatable-read 幻讀演示(雖然沒有讀到,但是能更新成功,且更新後就能讀到了)
begin;#2
select * from test;#3 id=7的不存在
update test set b = 999 where id = 7; #6 更新成功
select * from test;#7 id=7的存在,且b=999
commit;#9 end
mysql幻讀 mysql 幻讀
幻讀 phantom read 是指當使用者讀取某一範圍的資料行時,b事務在該範圍內插入了新行,當使用者再讀取該範圍的資料行時,會發現有新的 幻影 行。innodb和falcon儲存引擎通 過多版本併發控制機制解決了幻讀問題。a事務讀取了b事務已經提交的新增資料,此時 a 還沒有提交,當前提交後,也...
Mysql事務 髒讀,可重複讀,幻讀 測試
1 開啟mysql的命令列,將自動提交事務給關閉 檢視是否是自動提交 1表示開啟,0表示關閉 select autocommit 設定關閉 set autocommit 0 2 資料準備 建立資料庫 create database tran 切換資料庫 兩個視窗都執行 use tran 準備資料 c...
mysql 並沒有幻讀 mysql幻讀
幻讀 phantom read 前提條件 innodb引擎,可重複讀隔離級別,使用當前讀時。表現 乙個事務 同乙個read view 在前後兩次查詢同一範圍的時候,後一次查詢看到了前一次查詢沒有看到的行。兩點需要說明 1 在可重複讀隔離級別下,普通查詢是快照讀,是不會看到別的事務插入的資料的,幻讀只...