当用范围条件检索数据而不是相等条件检索数据,并请求共享或排他锁是,InnoDB会给符合范围条件的已有数据记录的索引项加锁;对于键值在条件范围内但不存在的记录,叫做间隙。InnoDB也会对这个间隙进行加锁,这种锁机制就是间隙锁。
间隙锁只会在Repeatable read隔离级别下使用,例如test表中有101条记录,其中id的值分别是1、2……101。Select * from test where id >100 for update;这就是一个范围查询,InnoDB不仅会给符合条件的id=101的记录加锁,也会对id>101(这些记录不存在)的间隙加锁。InnoDB使用间隙锁的目的:
第一,为了防止幻读。第二,满足恢复和复制的需要。MySQL的恢复机制要求在一个事务未提交前,其他事务不能插入满足其锁定条件的任何记录,也就是不允许出现幻读。