幻读
在一个事务开始(第一条sql执行后真正开始)后由于其他事务提交后插入或删除了数据,导致多次查询的结果不一样。
MVCC(Multi-Version Concurrency Control)
表中的每条数据都会添加两个字段:
- 创建版本号:创建记录时系统版本号
- 删除版本号:删除记录时系统版本号
事务开始后查询获取到的数据的范围
- 创建版本号<=当前事务版本号 保证取出的数据不会有后启动的事务中创建的数据。
- 删除版本号为空或>当前事务版本号 保证了至少在该事务开启之前数据没有被删除,是应该被查出来的数据。
gap锁
MVCC使用快照读的方式解决了部分幻读问题,但是在修改时由于还是当前读,还是有幻读问题,这个时候的解决方案就是gap锁。