From 5d462efce6af2cb23fc047b73dec11d1a5186b53 Mon Sep 17 00:00:00 2001 From: asahi Date: Wed, 13 Nov 2024 12:52:52 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=85=E8=AF=BBnext-key=20lock=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mysql/mysql文档/锁.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/mysql/mysql文档/锁.md b/mysql/mysql文档/锁.md index 38e0294..12d1d87 100644 --- a/mysql/mysql文档/锁.md +++ b/mysql/mysql文档/锁.md @@ -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 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,紧锁住索引本身,而不对范围进行加锁。` + + +