一、项目场景:
在学习mysql锁相关知识,自己操作时发现了一个现象:
对于命令select id from test where id in () lock in share mode;
当in中元素超过2个时,会锁住所有记录,升级成表锁。
二、问题描述
1. 问题复现
1.1. test表中数据
1.2. performance_schema.data_locks数据
1.3. 手动开启事务,并执行以下命令。
select id from test where id in (2) lock in share mode;
select id from test where id in (1,2) lock in share mode;
select id from test where id in (5,6) lock in share mode;
select id from test where id in (5,66) lock in share mode;
如上述可知,当in中元素在1或者2个时,能成功添加行锁。
1.4. 提交上述事务,再重新开启事务。
输入命令select id from test where id in (1,2,3) lock in share mode;
由上述可知,当in中元素超过2个时,会锁住所有记录,升级成表锁。
1.5. 拓展
并且执行命令
select id from test where (1,2,3) for update;
select id from test where id=1 or id=2 or id =3 lock in share mode;
也会升级成表锁
三、原因分析:
待补充= =