InnoDB存储引擎中的锁
一、锁类型
在 InnoDB 中实现了两个标准的行级锁,可以简单的看为两个读写锁:
S 共享锁:又叫读锁,其他事务可以继续加共享锁,但是不能继续加排他锁。
X 排他锁:又叫写锁,一旦加了写锁之后,其他事务就不能加锁了。
如果一个事务T1已经获得了行r的共享锁,那么另外的事务T2可以立即获得行r的共享锁,因为读取并没有改变行r的数据,称这种情况为锁兼容(Lock Compatible)。但若有其他的事务T3想获得行r的排他锁,则其必须等待事务T1、T2释放行r上的共享锁——这种情况称为锁不兼容。
二、锁的算法
InnoDB存储引擎有3种行锁的算法,其分别是:
Record Lock:单个行记录上的锁
Gap Lock:间隙锁,锁定一个范围,但不包含记录本身
Next-Key Lock∶Gap Lock+Record Lock,锁定一个范围,并且锁定记录本身 作者:河北王校长 https://www.bilibili.com/read/cv15138919/ 出处:bilibili
1. 记录锁(Record-Lock)
Record Lock总是会去锁住索引记录,如果InnoDB存储引擎表在建立的时候没有设置任何一个索引,那么这时InnoDB存储引擎会使用隐式的主键来进行锁定。
记录锁是锁住记录的,锁住的是索引记录,而不是我们真正的数据记录:
如果锁的是非主键索引,会在自己的索引上面加锁之后然后再去主键上面加锁锁住。
如果表上没有索引(包括没有主键),则会使用隐藏的主键索引进行加锁。
如果要锁的没有索引,则会进行全表记录加锁。
2. 间隙锁
间隙锁顾名思义锁间隙,不锁记录。锁间隙的意思就是锁定某一个范围,间隙锁又叫 gap 锁,其不会阻塞其他的 gap 锁,但是会阻塞插入间隙锁,这也是用来防止幻读的关键。
3. Next-Key Lock
Next-Key Lock是结合了Gap Lock和Record Lock的一种锁定算法,在Next-Key Lock算法下,InnoDB对于行的查询都是采用这种锁定算法。
在InnoDB 默认的事务隔离级别下,即REPEATABLEREAD下,InnoDB存储引擎采用Next-KeyLocking这种锁定算法。例如一个索引有10,11,13和20这四个值,那么该索引可能被Next-Key Locking的区间为:
(-∞,10]
(10,11]
(11,13]
(13,20]
(20,+∞)
当查询的索引含有唯一属性时,InnoDB存储引擎会对Next-Key Lock进行优化,将其降级为Record Lock,即仅锁住索引本身,而不是范围。
标签:存储,Record,Lock,Next,索引,引擎,InnoDB,Key From: https://www.cnblogs.com/hld123/p/18287103