2024-11-09  阅读(4)
版权声明:本文为博主付费文章,严禁任何形式的转载和摘抄,维权必究。 本文链接:https://www.skjava.com/mianshi/baodian/detail/4879406511

回答

插入意向锁是一种间隙锁。指一个事务执行时,被其他事务阻塞,在行插入之前由 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、插入意向锁案例