CS-Base icon indicating copy to clipboard operation
CS-Base copied to clipboard

唯一索引等值查询 TIP

Open NOS-AE opened this issue 2 years ago • 0 comments

图解MySQL 锁篇 MySQL是怎么加锁的 唯一索引等值查询 TIP

感觉TIP中的这个说法是否不够全面:

如果是用二级索引(不管是不是非唯一索引,还是唯一索引)进行锁定读查询的时候,除了会对二级索引项加行级锁(如果是唯一索引的二级索引,加锁规则和主键索引的案例相同),而且还会对查询到的记录的主键索引项上加「记录锁」。

利用二级索引查询的时候,如果是S锁(select...lock in share mode),并且走覆盖索引的话,也就是不会回表,这样是不会给主键索引加锁的,只会给二级索引加锁。这样带来的问题是,可以利用主键索引更新记录,导致第二次再查询的时候造成幻读。

解决办法有两种,第一个是查询多一个非覆盖索引的列,避免覆盖索引优化。第二个就是使用X锁(select...for update),这样Innodb就会认为你可能要做更新操作,就会主动把主键索引也加锁。

参考:MySQL实战45讲

NOS-AE avatar Oct 24 '23 13:10 NOS-AE