回答
InnoDB 默认的事务隔离级别是可重复读(Repeatable Read),InnoDB 在该隔离级别下使用临键锁(Next-key Lock)。临键锁能解决幻读问题(Phantom Reads),即保证事务在执行期间不会看到其他事务插入的行。临键锁的加锁规则如下:
- 加锁的基本单位是 next-key lock。而 next-key lock = gap lock + record lock,加锁区间为前开后闭。
- 查找过程中访问到的对象才会加锁。即回表时会对主键索引和二级索引都加锁,而覆盖索引查询则仅在覆盖索引上加锁。
- 索引上的等值查询,给唯一索引加锁的时候,next-key lock 退化为行锁。
- 索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,next-key lock 退化为间隙锁。
- 唯一索引上的范围查询会访问到不满足条件的第一个值为止。
扩展
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;
初始化如下数据: