如何解决幻读问题?
如何解决幻读问题?
一、幻读问题定义
幻读(Phantom Read)是指在同一事务内,连续执行两次相同的查询,第二次查询看到了第一次查询未看到的行。这种现象发生在可重复读(REPEATABLE READ)隔离级别下,主要由于其他事务插入(INSERT)了新数据导致。
go教程学习:https://duoke360.com/tutorial/path/golang
关键区别:不可重复读针对的是数据行的修改(UPDATE),而幻读针对的是数据行的新增(INSERT)
二、幻读的产生原理
1. InnoDB的MVCC机制
InnoDB通过多版本并发控制(MVCC)实现快照读:
- 每个事务启动时获得一个事务ID
- 通过ReadView机制判断数据行的可见性
- 当前读(如SELECT FOR UPDATE)会看到最新提交的数据
2. 间隙锁的缺失
在默认的REPEATABLE READ级别下:
- 对已有记录的修改会加行锁
- 但对不存在的记录(间隙)不加锁
- 其他事务可以在间隙中插入新数据