阅读next-key lock文档

This commit is contained in:
asahi
2024-11-13 12:52:52 +08:00
parent 34562345a9
commit 5d462efce6

View File

@@ -141,3 +141,26 @@ Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
间隙锁可以被显示的禁用,如果将事务的隔离级别改为`read committed`在查找和索引扫描时间隙锁将会被禁用间隙锁只会被用于外键检查和重复key检查。
### 行锁算法
innodb中有三种行锁的算法如下
- Record Lock单个行记录上的锁
- Gap Lock间隙锁锁定一个范围但是不包含记录本身
- Next-Key LockGap Lock + Record Lock锁定一个范围并且锁定记录本身
Record Lock是针对索引加的锁`如果在建表时没有为表设置索引那么innodb会采用隐式的主键来进行锁定。`
#### Next-Key Lock
Next-Key Lock结合了record lock和gap lock如果一个索引中有10111320这四条记录那么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紧锁住索引本身而不对范围进行加锁。`