有记录锁(record lock)、间隙锁(gap lock)、临键锁(next-key lock)。 记录锁又有S锁(共享锁或读锁)和X锁(排他锁或独占锁)。 间隙锁只有在repeated read隔离级别使用,用于防止其他事务在记录间插入新的记录,从而避免幻读现象。间隙锁主要是锁范围,是不包含记录本身,是全开区间。 临键锁用于锁范围和记录,包...
原则1:加锁的基本单位是前开后闭区间的 next-key lock。 原则2:查找过程中访问到的对象都会加锁。(范围查询会继续往后访问,访问到哪加锁到哪) 优化1:索引上的等值查询,给唯一索引加锁的时候,next-key lock 退化为行锁。 优化2:索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,next-key lock...
Next-Key Lock:记录锁与间隙锁组合起来用就叫做Next-Key Lock。 间隙锁:当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”, InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(Gap ...
行锁是针对某一行数据进行的锁定,可以防止其他事务修改该行数据。 间隙锁是针对某一范围的数据进行的锁定,可以防止其他事务在该范围内插入数据。 临建锁是行锁和间隙锁的组合,可以理解为一种特殊的间隙锁,它等于行锁+间隙锁,除了锁住记录本身,还会锁住索引之间的间隙,即锁定一段左开右闭的索引区间。 小结 MVCC ...
记录锁锁定的一定是主键索引树,如果是通过二级索引加锁,最终还是会定位到主键索引的行节点然后锁主键索引。如果通过一个没有索引的字段去加锁,由于定位不到主键索引的对应节点,所以需要进行全表扫描,会触发锁表,就像前面演示的效果 间隙锁 加入加锁的条件是一个区间,这个区间锁死,下面演示一下: 前面提到如果加锁...
第一行5的数据是行独占锁,所以就是左边5 闭合区间;第二行10 的数据是X,所以就是Next-key lock闭区间,最后得到的结果就是 [5,10]开启新事务 执行insert into test values(8,8,8,8);执行失败;执行insert into test values(4,4,4,4);执行成功!所以使用主键范围查询两个值都能查到的情况,左闭右闭...
临建锁是行锁和间隙锁的组合,可以理解为一种特殊的间隙锁,它等于行锁+间隙锁,除了锁住记录本身,还会锁住索引之间的间隙,即锁定一段左开右闭的索引区间。 小结 MVCC 和锁机制解决了 MySQL InnoDB 中 RR 事务隔离级别的幻读问题,而 MySQL 中的锁类型又有很多种,如行锁、间隙锁、临建锁等。
临建锁是行锁和间隙锁的组合,可以理解为一种特殊的间隙锁,它等于行锁+间隙锁,除了锁住记录本身,还会锁住索引之间的间隙,即锁定一段左开右闭的索引区间。 小结 MVCC 和锁机制解决了 MySQL InnoDB 中 RR 事务隔离级别的幻读问题,而 MySQL 中的锁类型又有很多种,如行锁、间隙锁、临建锁等。
间隙锁只有在repeated read隔离级别使用,用于防止其他事务在记录间插入新的记录,从而避免幻读现象。间隙锁主要是锁范围,是不包含记录本身,是全开区间。 临键锁用于锁范围和记录,包含记录本身是左开右闭区间。 共享锁(S) 事务读操作加的锁;对某一行加锁。