锁
共享锁与排他锁(Shared and Exclusive Locks)
概念: 行级锁,分为如下两种
- 共享锁S,允许事务读取行
- 排他锁X,允许事务更新和删除行
使用规则:如果事务T1持有r行的S锁,则针对T2事务对r行的操作:
- 如果请求S锁,可以获取成功,即T1、T2都具有r行的S锁;
- 如果请求X锁,则失败;
意向锁(Intention Locks)
概念:表级锁,分为如下两种
- 意向共享锁IS,给各个行设定共享锁;例:SELECT ... LOCK IN SHARE MODE
- 意向排他锁IX,给各个行设定排他锁;例:SELECT ... FOR UPDATE
- 举例验证???
使用规则:
- 事务在获取S锁之前,应先获取IS或更高级的锁;
- 事务在获取X锁之前,应先获取IX;
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 tabletest
.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数据插入。
- 对于使用唯一索引(Unique)能定位到唯一行的语句,不用间隙锁;例:SELECT * FROM child WHERE id = 100;//id 为Primary Key
- 间隙锁目的:防止其他事务插入间隙,另间隙锁可以共存;
下一键锁(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 tabletest
.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索引的操作的锁。
网友评论