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

回答

InnoDB 默认的事务隔离级别是可重复读(Repeatable Read),InnoDB 在该隔离级别下使用临键锁(Next-key Lock)。临键锁能解决幻读问题(Phantom Reads),即保证事务在执行期间不会看到其他事务插入的行。临键锁的加锁规则如下

  1. 加锁的基本单位是 next-key lock。而 next-key lock = gap lock + record lock,加锁区间为前开后闭。
  2. 查找过程中访问到的对象才会加锁。即回表时会对主键索引和二级索引都加锁,而覆盖索引查询则仅在覆盖索引上加锁。
  3. 索引上的等值查询,给唯一索引加锁的时候,next-key lock 退化为行锁
  4. 索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,next-key lock 退化为间隙锁
  5. 唯一索引上的范围查询会访问到不满足条件的第一个值为止。

扩展

Next-key Lock 案例分析

1、初始化数据

定义一张用户表(t_user)

CREATE TABLE `t_user` (
  `id` int NOT NULL,
  `age` int NOT NULL,
  `name` varchar(255) NOT NULL default '',
  `gender` char(1) NOT NULL default 'M',
  PRIMARY KEY (`id`),
  KEY `idx_age` (age)
) ENGINE=InnoDB;

初始化如下数据: