详解 MySql InnoDB 中的三种行锁(记录锁、间隙锁与临键锁)
前言 InnoDB 通过 MVCC 和 NEXT-KEY Locks ,解决了在 可重复读 的事务隔离级别下出现 幻读 的问题。 MVCC 我先挖个坑,日后再细讲,这篇文章我们主要来谈谈那些可爱的锁。 什么是幻读? 幻读是在 可重复读 的事务隔离级别下会出现的一种问题,简单来说, 可重复读 保证了当前事务不会读取到其他事务已提交的 UPDATE 操作。但同时,也会导致当前事务无法感知到来自其他事务中的 INSERT 或 DELETE 操作,这就是 幻读 。 关于行锁我们要知道的 行锁在 InnoDB 中是基于 索引 实现的,所以一旦某个加锁操作没有使用索引,那么该锁就会退化为 表锁 。 可爱的锁 记录锁(Record Locks) 顾名思义,记录锁就是为 某行 记录加锁,它 封锁该行的索引记录 : -- id 列为主键列或唯一索引列 SELECT * FROM table WHERE id = 1 FOR UPDATE; 复制代码 id 为 1 的记录行会被锁住。 需要注意的是: id 列必须为 唯一索引列 或 主键列 ,否则上述语句加的锁就会变成 临键锁 。 同时查询语句必须为 精准匹配 ( = ),不能为 > 、 < 、 like 等,否则也会退化成 临键锁 (感谢评论区 @decodes 提醒)。 其他实现 在通过 主键索引 与 唯一索引 对数据行进行 UPDATE 操作时