mysql 锁 ~ gap lock

基本定义
幻读
    幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样.一般解决幻读的方法是增加范围锁RangeS,锁定检索范围为只读,这样就避免了幻读。
gap lock
    InnoDB工作在可重复读隔离级别下,并且会以Next-Key Lock的方式对数据行进行加锁,这样可以有效防止幻读的发生。Next-Key Lock是行锁和间隙锁的组合,当InnoDB扫描索引记录的时候,会首先对索引记录加上行锁(Record Lock),再对索引记录两边的间隙加上间隙锁(Gap Lock)。加上间隙锁之后,其他事务就不能在这个间隙修改或者插入记录。
注意点
   1 Gap Lock在InnoDB的唯一作用就是防止其他事务的插入操作,也即是插入意向锁的申请锁操作,以此防止幻读的发生。
   2 gap lock上增加的是S锁,非唯一性索引上一个值的闭区间,和下一个值的开区间,左闭又开 
   3 在innodb日志里的表现形式为 lock_mode X locks gap before rec insert intention waiting
   4 通过主键或则唯一索引来锁定不存在的值,也会产生GAP锁定 eg delete from a where id <4 实际ID=4的记录并不存在,但是会依然锁定整个范围
加锁的具体细节
  1 找到满足条件的记录,并且记录有效,则对记录加X锁,No Gap锁(lock_mode X locks rec but not gap);
  2 找到满足条件的记录,但是记录无效(标识为删除的记录),则对记录加next key锁(同时锁住记录本身,以及记录之前的Gap:lock_mode X);
  3 未找到满足条件的记录,则对第一个不满足条件的记录加Gap锁,保证没有满足条件的记录插入(locks gap before rec);

猜你喜欢

转载自www.cnblogs.com/danhuangpai/p/9836693.html