查询初始数据
开启A事务 并做更新操作
再另一端 B开始另一个事务查询 事务级别设置为读未提
查询到事务未提交的数据 a的count修改为3 但是没有提交
2 第二个级别 读已提交 避免脏读问题 但是有不可重复读问题
回滚数据 修改隔离级别 确保都是 读已提交级别
客户端A
客户端B
验证 脏读问题
客户端A
客户端B 查询出结果 没有脏读问题
A提交事务 B再查询
测试不可重复读问题
A客户端 开始事务 先进行一次查询 仍然设置为读已提交的隔离级别
此时 A客户端 没有提交事务 开启B客户端 做更新操作
此时A客户端再次查询 结果不一样 在一个事务中 两次查询不一样
3 第三个级别 可重复读 避免 不可重复读问题;
确保客户端A 和 客户端B都是 可重复读的隔离级别
客户端A 第一次查询
客户端B 开启事务 并更新 然后 提交事务
这时 客户端A 再次查询数据 仍然是15 所以 避免了不可重复读的问题
测试幻读问题
同样保持之前的数据 客户端B开始事务 插入数据
客户端B
此时 客户端A再次查询 还是一样
经过查询 据说来源于 MySQL技术内幕 :InnoDB存储引擎
之前提到一般情况下MySQL的InnoDB引擎在可重复读的情况下是没法保证不出现幻读的,但实际情况是MySQL可以通过加锁来防止幻读的出现,这种锁定通过Next-key机制来实现,是属于记录锁和间隙锁(Gap锁)的结合。
《MySQL技术内幕:InnoDB存储引擎》-第六章:锁