mysql InnoDB行锁的三种算法 随记1

3种锁算法

Record Lock:单个行记录上的锁
Gap Lock:间隙锁,锁定一个范围,但不包含记录本身
Next-Key Lock:Gap Lock + Record Lock,锁定一个范围,并且锁定记录本身

Record Lock

  1. Record Lock总是会去锁住索引记录,如果InnoDB存储引擎表在建立的时候没有设置任何一个索引,那么这时InnoDB存储引擎会使用隐式的主键来进行锁定。

Next-Key Lock

  1. Next-Key Lock是结合了Gap Lock 和 Record Lock的一种锁定算法,在Next-Key Lock算法下,InnoDB对于行的查询都是采用这种锁定算法。例如一个索引有10,11,13和20这四个值,那么改索引可能被Next-Key Lock的区间为:
    在这里插入图片描述
    然而,当查询的索引含有唯一属性时,InnoDB 存储引擎会对Next-Key Lock 进行优化,将其降级为Record Lock ,即仅锁住索引本身,而不是范围。
    看下面的例子,首先根据如下代码创建测试表t
CREATE TABLE t a INT PRIMARY KEY
INSERT INTO t SELECT 1
INSERT INTO SELECT 2
INSERT INTO t SELECT 5

在这里插入图片描述

表t共有1、2、5三个值。在上面的例子中,在会话A中首先对a=5进行X锁定而由于a是主键且唯一,因此锁定的仅是5这个值,而不是(2,5)这个范围,这样在会话B中插入值4而不会阻塞,可以立即插入并返回。即锁定由Next-Key Lock 算法降级从而提高应用的并发性。

猜你喜欢

转载自blog.csdn.net/itlijinping_zhang/article/details/117035422