回答
插入意向锁是一种间隙锁。指一个事务执行时,被其他事务阻塞,在行插入之前由 insert 语句设置,提前锁定的某一行。插入意向锁是 InnoDB 引擎在提高并发,减少死锁的优化。具有如下特点:
- 阻塞等待。在 InnoDB 中,一个事务插入一条记录时,需先判断插入位置处是否被其他事务加了临键锁(next-key lock)。如有,插入操作会被阻塞并会加一个插入意向锁,表明有事务想要在该区间插入新纪录,现在处于等待状态。
- 行级锁。插入意向锁是行锁而非意向锁,意向锁是表级锁。
- 提升并发性。同一间隙锁区间内,非同一插入位置的多个插入意向锁互不影响,不需要互相等待。也就是说插入意向锁是锁住某个点,有助于提高插入并发性。这是至关重要的。
- 避免死锁。插入同一索引间隙的多个事务,如果不是插入间隙内的同一位置,无需互相等待。如此会降低锁冲突,减少死锁。
扩展
插入意向锁案例
1、数据准备
定义一张用户表(t_user)
CREATE TABLE `t_user` (
`id` int NOT NULL,
`age` int NOT NULL,
`name` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`),
KEY `idx_age` (age)
) ENGINE=InnoDB;
初始化如下数据:
insert into t_user(id,age,name) values (10, 10, 'aa');
insert into t_user(id,age,name) values (20, 20, 'ab');
insert into t_user(id,age,name) values (30, 30, 'ac');
insert into t_user(id,age,name) values (40, 40, 'ad');
insert into t_user(id,age,name) values (50, 50, 'ee');
insert into t_user(id,age,name) values (100, 100, 'ff');
insert into t_user(id,age,name) values (200, 200, 'gg');
2、插入意向锁案例