Skip to main content

加锁的原理

联合索引的加锁原理

  1. 锁定索引行:当查询或修改操作使用了联合索引时,MySQL会先锁定索引行,以防止其他事务同时对该行进行修改。这样可以避免脏读或不可重复读等并发问题。
  2. 锁定相关数据行:一旦索引行被锁定,MySQL会根据查询条件或修改操作,锁定相关的数据行。这样可以确保在事务执行期间,其他事务不能对这些数据行进行修改。
  3. 释放锁定:当事务执行完成后,MySQL会释放对索引行和数据行的锁定,以允许其他事务对其进行访问和修改。

0881af31b5cef5d2d9eaf6197b5ebbb9.png

接下来以两条SQL的执行为例,讲解一下InnoDB对于单行数据的加锁原理:

  1. update user set age = 10 where id = 49;
  2. update user set age = 10 where name = 'Tom';

第一条SQL使用主键查询,只需要在 id = 49 这个主键索引上加上锁。第二条 SQL 使用二级索引来查询,那么首先在 name = Tom 这个索引上加写锁,然后由于使用 InnoDB 二级索引还需再次根据主键索引查询,所以还需要在 id = 49 这个主键索引上加锁。

也就是说使用主键索引需要加一把锁,使用二级索引需要在二级索引和主键索引上各加一把锁。

参考

[非唯一索引加锁等值查询] https://github.com/xiaolincoder/CS-Base/blob/main/mysql/lock/how_to_lock.md#%E9%9D%9E%E5%94%AF%E4%B8%80%E7%B4%A2%E5%BC%95%E7%AD%89%E5%80%BC%E6%9F%A5%E8%AF%A2