InnoDB可重复读隔离级别下如何避免幻读?
表象:快照读(非堵塞读)
在Repeatable-read隔离级别下,如果先在别的事务操作数据之前,创建了快照读,不管别的事务怎么操作数据,当前事务再次使用快照读时,查到的依旧是老版本的数据。
内在:next-key锁(行锁+gap锁)
真正防止幻读发生是因为事务在Repeatable-read隔离级别以上(包括)对数据加了next-key锁。next-key锁由行锁和gap锁组成。
next-key锁
由行锁和gap锁组成
行锁就是对行记录加的锁。
Gap锁
1.目的是防止同一事务的两次当前读出现幻读的情况。
2.Repeatable-read级别以上支持Gap