一、引子
与SQL标准不同的地方在于InnoDB存储引擎在REPEATABLE-READ(可重复读)事务隔离级别下使用的是Next-Key Lock锁算法,因此可以避免幻读的产生,
这与其他数据库系统比如SQL Server是不同的。
所以说InnoDB存储引擎的默认支持的隔离级别,已经可以完全保证事务的隔离性要求,即达到了SQL标准的SERIALIZABLE(可串形化)的隔离级别。
那么MySQL是如何在PR级别下防止幻读的发生的呢?
1.在快照读的情况下,MySQL通过MVCC来避免幻读
快照读,读取的是记录的可见版本,主要应用于无需加锁的select操作
2.在当前读的情况下,MySQL通过next-key lock来避免幻读
当前读,读取的是记录的最新版本,主要应用于加行共享锁、行排他锁的操作,会对当前记录加锁。
二、间隙锁
间隙锁的出现是为了在InnoDB可重复读的隔离级别下,解决幻读问题产生的。
间隙锁会封锁该条记录相邻两个键之间的空白区域,防止其他事务在这个区域内插入,修改,删除数据。
所谓间隙,是将数据氛围不同区间,对区间范围进行加锁,规则为左开右闭。
待续