mysql innodb 幻讀測試

2021-10-05 17:11:49 字數 1725 閱讀 3302

//檢視隔離級別

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 在可重複讀隔離級別下,普通查詢是快照讀,是不會看到別的事務插入的資料的,幻讀只...