InnoDB可重复读隔离级别下如何避免幻读?

InnoDB可重复读隔离级别下如何避免幻读?
表象:快照读(非阻塞读)—伪MVCC
内在:next-key锁,(行锁+gap锁)

InnoDB可重复读隔离级别下如何避免幻读?

当前读:加锁的增删改查语句,无论什么锁,因为读取的是当前最新版本,还要保证并发事务不能修改当前记录,对读取记录加锁。
快照读:可能读取到的数据不是最新版本而是历史版本。
read committed级别下。当前读与快照读读取的版本一样。
repeatable read 级别下,当前读返回的是数据的最新版本,快照读返回的可能数据未修改前的版本也可能是最新的数据版本。因为在RR级别下,事务调用快照读的时机很重要,创建快照的时机决定了读取的版本。
例: update 数据 版本一 --》版本二
当前度 —。版本二
快照读---- 版本二


快照度----。版本一数据更新前先调用快照读查询数据后,在更新数据,快照度查询可能会导致数据未获取到最新版本。
update 数据 版本一 --》版本二
当前度 —。版本二
快照读---- 版本一

RC RR级别下的InnoDB快照读如何实现?
DB_TRX_ID----该字段标明最近一次对数据做修改
DB_ROLL_PTR----回滚指针,写入回滚段的undo日志
DB__ROW_ID ----行号 随着新行出现单调递增的id
undo日志主要分为insert undo日志(事务回滚涉及)和uodate undo日志(事务回滚和快照读都涉及)
对事务变更就会产生undo记录,存储的是老版数据,事务回滚需要。
undo日志工作方式:InnoDB可重复读隔离级别下如何避免幻读?
read view —可见性判断来决定当前看的是哪个版本数据
在这里插入图片描述