回答
插入意向锁是一种间隙锁。指一个事务执行时,被其他事务阻塞,在行插入之前由 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;
初始化如下数据: