//查看隔离级别
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 |