关于SELECT...FOR UPDATE到底锁表还是锁行
结论:无论是不是唯一索引,既锁表也锁行
不是像网上说的唯一索引锁行,非唯一索引缩表。
实验
先看表结构和数据:
可以看到 docters.name是唯一索引,docters.on_call不是索引。
mysql如何查看锁状态?
可以通过show engine innodb status;
查看。
或者
mysql8.0之前使用命令select * from information_schema.innodb_locks;
mysql8.0之后使用命令select * from performance_schema.data_locks;
什么都没操作之前看一下锁状态,图片如下:
对docters.name唯一索引字段做普通查询,不加锁,图片如下:
对docters.name唯一索引字段做for update
查询,加IX
表锁和两个非间隙锁的行锁,图片如下:
对docters.on_call非索引字段做for update
查询,加IX
表锁和两个非间隙锁的行锁,以及一个gap
锁,图片如下: