innoDB加锁规则

锁的类型

  • 行锁record lock,锁住的是一行索引记录 (读已提交和可重复读隔离级别都有)
  • 间隙锁gap lock,锁住的是一个开区间 (只有可重复读隔离级别才有)
  • next-key lock = 行锁+间隙锁,左开右闭区间(只有可重复读隔离级别才有)

加锁规则:两个原则,两个优化,一个bug(可重复读隔离级别)

  1. 原则1:加锁的基本单位是next-key lock。注意是前开后闭区间。
  2. 原则2:查找过程中访问到的对象才会加锁。锁是加在索引上的。
  3. 优化1:索引上的等值查询,给唯一索引加锁时,next-key lock会退化成行锁。
  4. 优化2:索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,next-key lock退化成间隙锁。
  5. 一个bug:唯一索引的范围查询会访问到不满足条件的第一个值为止。

读已提交隔离级别

读已提交隔离级别,基本上只用行锁,很少会用间隙锁。而且它有一个优化是:语句执行过程中加上的行锁,在语句执行完成后,就要把“不满足条件的行”上的行锁直接释放了,不需要等到事务提交。

你可能感兴趣的:(数据库)