准备工作以及SQL解释参考:https://mp.csdn.net/postedit/98398695
执行步骤
SESSION A | SESSION B | |
T1 | SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; | |
T2 | START TRANSACTION; | |
T3 | SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; | |
T4 | START TRANSACTION; | |
T5 | SELECT * FROM t1; -- 结果为空 | |
T6 | INSERT INTO `t1` VALUES (1, 100); | |
T7 | SELECT * FROM t1; -- 结果为空 | |
T8 | COMMIT; | |
T9 | SELECT * FROM t1; -- 结果为空 | |
T10 | INSERT INTO `t1` VALUES (1, 100); -- ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY' |
SQL执行结果分析:
- SESSION A在 T7 时刻没有读取到SESSION B在 T6 时刻添加的数据【1, 100】,解决了脏读问题。
- SESSION A在 T5、T7 和 T9 时刻执行了相同的SQL,结果相同,结局了不可重复读问题。
- SESSION A在 T10 时刻执行插入语句,发生了错误,ID为1的记录已存在,但是并没有查询到,发生了幻读问题。