阅读next-key lock文档
This commit is contained in:
@@ -141,3 +141,26 @@ Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
|
|||||||
|
|
||||||
间隙锁可以被显示的禁用,如果将事务的隔离级别改为`read committed`,在查找和索引扫描时间隙锁将会被禁用,间隙锁只会被用于外键检查和重复key检查。
|
间隙锁可以被显示的禁用,如果将事务的隔离级别改为`read committed`,在查找和索引扫描时间隙锁将会被禁用,间隙锁只会被用于外键检查和重复key检查。
|
||||||
|
|
||||||
|
### 行锁算法
|
||||||
|
innodb中有三种行锁的算法,如下:
|
||||||
|
- Record Lock:单个行记录上的锁
|
||||||
|
- Gap Lock:间隙锁,锁定一个范围,但是不包含记录本身
|
||||||
|
- Next-Key Lock:Gap Lock + Record Lock,锁定一个范围,并且锁定记录本身
|
||||||
|
|
||||||
|
Record Lock是针对索引加的锁,`如果在建表时没有为表设置索引,那么innodb会采用隐式的主键来进行锁定。`
|
||||||
|
|
||||||
|
#### Next-Key Lock
|
||||||
|
Next-Key Lock结合了record lock和gap lock,如果一个索引中有10,11,13,20这四条记录,那么next-key lock的可锁定区间如下:
|
||||||
|
- (-∞, 10]
|
||||||
|
- (10, 11]
|
||||||
|
- (11, 13]
|
||||||
|
- (13, 20]
|
||||||
|
- (20, +∞)
|
||||||
|
|
||||||
|
Next-Key Lock是为了解决幻读问题而引入的,如果事务T1已经锁定了`(10, 11]`和`(11, 13]`区间,那么在T1插入值为12的记录时,锁定的范围会变为:
|
||||||
|
`(10, 11] (11, 12] (12, 13]`。
|
||||||
|
|
||||||
|
但是,`如果查询的索引为unique索引,那么innodb则是会针对next-key lock进行优化,将其降级为record lock,紧锁住索引本身,而不对范围进行加锁。`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user