MySQL幻读测试
根据以下表数据进行MySQL innodb幻读测试
- 进入mysql
mysql -uroot
- 设置隔离级别为可重复读
set global tx_isolation='repeatable-read';
set session tx_isolation='repeatable-read';
- 查询表数据
SELECT * FROM test;
- 开启两个个事务根据序号进行执行语句
事务一:
BEGIN;#1
SELECT * FROM test;#3 三条数据,id=4的不存在
INSERT INTO test(id,a,b) VALUES (4, 1,2); #4,插入id=4
COMMIT;#6
事务二:
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 四条结果
** 综上:
没有读到,但是插入会报错。
- 开启两个个事务根据序号进行执行语句
事务一:
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
事务二:
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
** 综上:
虽然没有读到,但是能更新成功,且更新后就能读到了,事务一读取到两遍的值不同。