幻读本质
可重复读的快照机制仅保证主键索引的一致性,二级索引的查询可能绕过快照,实时读取新数据。
快照是基于MVCC,范围查询和覆盖索引则绕过了MVCC规则
前提条件:
1.通过主键(一级)索引查询不会,应用快照过滤
2.通过二级索引的等值查询(查询字段非二级索引字段)不会,通过回表,应用快照过滤
3.通过二级索引的范围查询/覆盖索引,不需要回表,直接读当前表数据
4.对于快照的版本号控制(版本号与undo日志有关),新增数据,没有旧版本号,所以版本号比对规则对新增数据无效,这是innodb的性能优化,避免新增行生成undo日志
覆盖索引--伪幻读
范围查询--传统幻读
幻读本质:新增行数据绕过了MVCC
MVCC的局限性:
1.MVCC仅管理已存在行数据的版本号,对于新增行数据,不能通过trx_id控制
2.范围查询可能匹配到快照中不存在但未来插入的数据,间隙锁是唯一阻止此类插入的机制
如:全表扫描不通过索引的间隙锁保护,导致 MVCC 的版本校验失效,查询直接返回物理数据页中的最新数据。
幻读底层原理:可见性原则与新增数据冲突
幻读产生的关键:范围查询的“无锁扫描”
锁:
1.读/写或共享锁/排他锁
2.显示/隐式
3.行/间隙/表
4.语句锁/事务锁
5.乐观/悲观
快照与锁关系:
数据库会根据隔离设置/级别/要求:采用快照(MVCC)或锁或两种方式来实现,用快照配合锁完成,提升系统性能,快照实现类似乐观锁

浙公网安备 33010602011771号