插入意向锁是在行插入之前由insert操作设置的一种间隙锁。该锁定以这样一种方式发出插入意图的信号,即如果插入到同一索引间隙中的多个事务不在间隙内的同一位置插入,则它们不需要彼此等待。假设存在值为4和7的索引记录。尝试分别插入值为5和6的单独事务,在获得插入行的独占锁之前,每个事务都使用插入意图锁锁定4和7之间的间隙,但不会相互阻止,因为这些行不冲突。
下面的示例演示了一个事务,该事务在获得插入记录的独占锁之前使用插入意图锁。该示例涉及两个客户端,A和B。
客户端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和INNODB监视器输出中显示如下:
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(自增锁)
AUTO-INC锁是一种特殊的表级锁,由插入到具有AUTO_INCREMENT列的表中的事务使用。在最简单的情况下,如果一个事务正在向表中插入值,则任何其他事务都必须等待向该表中进行自己的插入,以便第一个事务插入的行接收连续的主键值。
innodb_autoinc_lock_mode变量控制用于自动增量锁定的算法。它允许您选择如何在可预测的自动增量值序列和插入操作的最大并发性之间进行权衡。