阅读间隙锁文档

This commit is contained in:
asahi
2024-11-13 12:27:04 +08:00
parent d2f82e210c
commit 34562345a9

View File

@@ -121,6 +121,23 @@ Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
并且,`for update`或`lock in share mode`添加的行锁在事务commit或rollback时会被释放。
### Gap Lock
gap lock是针对index record之间的间隙来进行加锁的或是针对第一条index record之前或最后一条index record之后的间隙进行加锁。例如`SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE; `语句会阻止其他事务在c1值的`10~20`范围之间插入数据,不管这条数据存不存在,在`10~20`的间隙之前所有的值都被锁定了。
间隙范围可能跨单个索引值,多个索引值甚至为空。
间隙锁在部分的事务隔离级别中有使用,在其他隔离级别中则不会被使用。
在通过unique index区查询唯一行时并不需要使用间隙锁并不包含unique复合索引的情况。例如在id为唯一索引的情况下如下所示的语句只会使用index record lock
```sql
SELECT * FROM child WHERE id = 100;
```
但是如果id并不是索引或者id的缩影并不unique那么上述语句会对之前的间隙进行加锁。
值得注意的是不同事务针对同一间隙可以持有相互冲突的锁。例如A事务针对间隙持有S锁而B事务针对间隙持有X锁当index record从索引中被清除时不同事务所持有的间隙锁将会被合并。
在innodb中间隙锁只是为了防止其他事务在该间隙中插入锁间隙锁是可以共存的。如果事务A针对间隙加锁这并不会阻止事务B获取同一间隙的锁。`间隙的S锁和X锁都遵循该规则,且S锁和X锁之间并不会相互冲突间隙的S锁和X锁功能相同`。
间隙锁可以被显示的禁用,如果将事务的隔离级别改为`read committed`在查找和索引扫描时间隙锁将会被禁用间隙锁只会被用于外键检查和重复key检查。