加载中...

| 基本类型 | 共享锁(S)/ 排他锁(X) |
| InnoDB 特有锁 | 间隙锁(Gap Lock)、Next-Key Lock |
| 行锁前提 | 查询必须走索引,否则升级为表锁 |
最基础的两类锁是共享锁(S 锁)和排他锁(X 锁)。S 锁允许多个事务同时读取同一行,但其中任何一个想写时必须先升级为 X 锁;X 锁则完全独占,其他事务既不能读也不能写。
在 InnoDB 里,普通 SELECT 默认不加任何锁(依靠 MVCC 读快照),SELECT ... FOR SHARE 加 S 锁,SELECT ... FOR UPDATE 加 X 锁。后两者常用于先查后改的场景,防止在读取到修改之间被其他事务改掉。[1]
InnoDB 支持行级锁,锁定的是索引记录,而不是物理行。这有个重要推论:如果查询条件没有命中索引,InnoDB 会退化成锁整张表,并发性能急剧下降。
间隙锁(Gap Lock)是 InnoDB 在可重复读隔离级别下特有的锁类型,锁定的是两个索引值之间的空间,目的是防止幻读(Phantom Read)。比如事务 A 查询了 age BETWEEN 20 AND 30 的记录,间隙锁会阻止其他事务在这个范围内插入新行。Next-Key Lock 是行锁加上其前面间隙锁的组合,是 InnoDB 默认的行锁算法。

| 基本类型 | 共享锁(S)/ 排他锁(X) |
| InnoDB 特有锁 | 间隙锁(Gap Lock)、Next-Key Lock |
| 行锁前提 | 查询必须走索引,否则升级为表锁 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧