明确一些概念
DB_TRX_ID: 记录当前数据行最后一次的更新和插入的事务id
DB_ROLL_PTR: 指向当前记录项的undo log信息
DB_ROW_ID:标识插入的新数据行
如何保证可重复读:事务活跃数组array
1.事务开启后,有一个数组array用来维护当前活跃的事务id(开启未提交)
2.事务id最大值+1记作高水位
3.事务id最小值记作低水位
每一行数据都会有一个undo log的链,当前事务根据数据行的DB_TRX_ID和array决定是否能够查看值。
DB_TRX_ID如果大于高水位,不可查看;DB_TRX_ID小于低水位,可查看;DB_TRX_ID在之间,判断DB_TRX_ID是否在array中,如果在,不可读。
下面引出一个问题
Innodb的可重复读机制能够避免幻读么?
乍一看,通过MVCC机制和间隙锁貌似保证了select和update的问题,但是insert的问题却没有解决,所以还是会存在幻读的情况