Read View:
Read View 是事务进行快照读的时候生成的视图,在事务执行快照读的那一刻,会生成一个数据系统当前的快照,记录并维护系统当前活跃事务的id,事务的id值是递增的。
Read View 的最大作用是用来做可见性判断的,有三个全局属性:
trx_list:一个数值列表,存储活跃的事务ID
up_limit_id:记录 trx_list 列表中事务ID最小的ID
low_limit_id:记录 Read View 生成时刻系统尚未分配的下一个事务ID
具体的比较规则如下:
首先比较 DB_TRX_ID < up_limit_id,是:当前事务能看到 DB_TRX_ID 所在的记录,否:进入下一个判断
判断 DB_TRX_ID >= low_limit_id,是:代表 DB_TRX_ID 所在的记录在 Read View 生成后才出现的,对于当前事务肯定不可见,否:进入下一步判断
判断 DB_TRX_ID 是否在活跃事务中,是:当前事务是看不到活跃事务的,否:说明这个事务在 Read View 生成之前就已经提交了,那么修改的结果是能够看见的。
RC、RR级别下快照读有什么不同
在 RC 隔离级别下,每个快照读都会生成并获取最新的 Read View
在 RR 隔离级别下,同一个事务中的第一个快照读才会创建 Read View,之后的快照读获取的都是同一个 Read View
如何解决幻读问题
如果事务中都是用快照读,那么不会产生幻读的问题
快照读和当前读一起使用的时候就会产生幻读
如果都是当前读的话,通过间隙锁来解决幻读问题