加锁的原理
联合索引的加锁原理
- 锁定索引行:当查询或修改操作使用了联合索引时,MySQL会先锁定索引行,以防止其他事务同时对该行进行修改。这样可以避免脏读或不可重复读等并发问题。
- 锁定相关数据行:一旦索引行被锁定,MySQL会根据查询条件或修改操作,锁定相关的数据行。这样可以确保在事务执行期间,其他事务不能对这些数据行进行修改。
- 释放锁定:当事务执行完成后,MySQL会释放对索引行和数据行的锁定,以允许其他事务对其进行访问和修改。
接下来以两条SQL的执行为例,讲解一下InnoDB对于单行数据的加锁原理:
update user set age = 10 where id = 49;
update user set age = 10 where name = 'Tom';
第一条SQL使用主键查询,只需要在 id = 49 这个主键索引上加上锁。第二条 SQL 使用二级索引来查询,那么首先在 name = Tom 这个索引上加写锁,然后由于使用 InnoDB 二级索引还需再次根据主键索引查询,所以还需要在 id = 49 这个主键索引上加锁。
也就是说使用主键索引需要加一把锁,使用二级索引需要在二级索引和主键索引上各加一把锁。