【无标题】11111
记录锁(Record Lock) 单行记录锁,锁住索引记录,如果没有则锁定隐式主键。
间隙锁(Gap Lock) 锁定一个范围,不包含当前行。
临键锁(Next-Key Lock) 默认行查询使用,`记录锁+间隙锁合体`,锁定一个范围,包含当前行。解决幻读(Phantom),如果是主键且唯一,会降级为记录锁。
意向锁(Intention Locks) 为了支持多粒度(表锁与行锁)的锁并存,引入意向锁,是表级锁。
插入意向锁(Insert Intention Locks) 为了插入时保证正确,范围锁的一种,与Gap锁不兼容。
标题死锁日志的关键词含义
记录锁(LOCK_REC_NOT_GAP): lock_mode X locks rec but not gap
间隙锁(LOCK_GAP): lock_mode X locks gap before rec
Next-key 锁(LOCK_ORNIDARY): lock_mode X
插入意向锁(LOCK_INSERT_INTENTION): lock_mode X locks gap before rec insert intention
锁选择
update锁什么
1)、如果更新条件没有走索引,例如执行”update from t1 set v2=0 where v2=5;” ,此时会进行全表扫描,扫表的时候,要阻止其他任何的更新操作,所以上升为表锁。
2)、如果更新条件为索引字段,但是并非唯一索引(包括主键索引),例如执行“update from t1 set v2=0 where v1=9;”
那么此时更新会使用Next-Key Lock。使用Next-Key Lock的原因:
a)、首先要保证在符合条件的记录上加上排他锁,会锁定当前非唯一索引和对应的主键索引的值;
b)、还要保证锁定的区间不能插入新的数据。
3)、如果更新条件为唯一索引,则使用Record Lock(记录锁)。
InnoDB根据唯一索引,找到相应记录,将主键索引值和唯一索引值加上记录锁。但不使用Gap Lock(间隙锁)。MySQL InnoDB 锁表与锁行
**
前面我们说的 GAP LOCK 其实是锁的属性,另外我们知道 InnoDB 常规锁模式有:S 和 X,即共享锁和排他锁。锁模式和锁属性是可以随意组合的
insert锁什么
-
在t1插入记录时,是不加锁的。这个时候事务t1还未提交的情况下,事务t2尝试插入的时候,发现有这条记录,t2尝试获取S锁,会判定记录上的事务id是否活跃,如果活跃的话,说明事务未结束,会帮t1把它的隐式锁提升为显式锁(X锁);
-
一个已提交但是未purge掉的记录会造成后续插入获取S共享锁,两个事务同时获取S锁,然后尝试获取插入意向锁,造成死锁
**
delete锁什么
MySQL DELETE 删除语句加锁分析
1.删除存在的记录:可能无gap锁
1.1在非唯一索引的情况下,删除一条存在的记录是有gap锁,锁住记录本身和记录之前的gap
1.2在唯一索引和主键的情况下删除一条存在的记录,因为都是唯一值,进行删除的时候,是不会有gap存在——精准
2.删除不存在的记录:有gap锁
2.1非唯一索引,唯一索引和主键在删除一条不存在的记录,均会在这个区间加gap锁
3.删除标记为删除的记录:有gap锁
3.1通过非唯一索引和唯一索引去删除一条标记为删除的记录的时候,都会请求该记录的行锁,同时锁住记录之前的gap
RC 情况下是没有gap锁的,除了遇到唯一键冲突的情况,如插入唯一键冲突。