Innodb锁

2020-01-16  本文已影响0人  段一萌

共享锁与排他锁(Shared and Exclusive Locks)

概念: 行级锁,分为如下两种

使用规则:如果事务T1持有r行的S锁,则针对T2事务对r行的操作:

意向锁(Intention Locks)

概念:表级锁,分为如下两种

使用规则:

S锁/X锁/IS锁/IX锁的兼容性如下:
[图片上传失败...(image-2ea3dd-1579158381956)]

注: 意向锁不会阻止除全表请求(例如LOCK TABLES ... WRITE)以外的任何内容。意向锁的主要目的是:表明有人正在锁定表中的行,或者打算锁定表中的行。

记录锁(Record Locks)

概念:记录锁定是对索引记录的锁定。例:SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE; 可以防止任何插入、更新或删除t.c1=10的行;
原则:记录锁定始终锁定索引记录,即使没有定义索引的表也是如此。对于这种情况,请InnoDB创建一个隐藏的聚集索引,并将该索引用于记录锁定。

RECORD LOCKS space id 58 page no 3 n bits 72 index PRIMARY of table test.t
trx id 10078 lock_mode X locks rec but not gap
Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
0: len 4; hex 8000000a; asc ;;
1: len 6; hex 00000000274f; asc 'O;;
2: len 7; hex b60000019d0110; asc ;;

间隙锁

概念:间隙锁定是对索引记录之间的间隙的锁定,或者是对第一个之前或最后一个之后索引记录的锁定。例:SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE;阻止其他事务将c1=15数据插入。

下一键锁(Next-Key Locks)

概念:记录锁和间隙之前的间隙锁的组合;
区间如下:

(negative infinity, 10]
(10, 11]
(11, 13]
(13, 20]
(20, positive infinity)

注: InnoDB执行行级锁的方式是,当它搜索或扫描表索引时,会在遇到的索引记录上设置共享或互斥锁;因此,行级锁实际上是索引记录锁。

插入意向锁(Insert Intention Locks)

概念:插入意图锁是一种插入行数据操作之前的间隙锁。
例:
客户端A创建一个包含两个索引记录(90和102)的表,然后启动一个事务,该事务将排他锁放置在ID大于100的索引记录上。排他锁在记录102之前包括一个间隙锁:

mysql> CREATE TABLE child (id int(11) NOT NULL, PRIMARY KEY(id)) ENGINE=InnoDB;
mysql> INSERT INTO child (id) values (90),(102);
mysql> START TRANSACTION;
mysql> SELECT * FROM child WHERE id > 100 FOR UPDATE;
+-----+
| id |
+-----+
| 102 |
+-----+

客户B开始交易以将记录插入空白。事务在等待获得排他锁的同时获取插入意图锁。

mysql> START TRANSACTION;
mysql> INSERT INTO child (id) VALUES (101);

通过SHOW ENGINE INNODB STATUS查看:

RECORD LOCKS space id 31 page no 3 n bits 72 index PRIMARY of table test.child
trx id 8731 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 3 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
0: len 4; hex 80000066; asc f;;
1: len 6; hex 000000002215; asc " ;;
2: len 7; hex 9000000172011c; asc r ;;...

自动递增锁(AUTO-INC Locks)

概念:通过事务插入到AUTO_INCREMENT列时,获取的一个特殊的表级锁。

空间索引谓语锁

概念:InnoDB支持SPATIAL,处理涉及SPATIAL索引的操作的锁。

上一篇 下一篇

猜你喜欢

热点阅读