时间:2021-07-01 10:21:17 帮助过:2人阅读
mysql版本:5.5.34
在使用select for update来加锁的时候,遇到间隙锁,锁住了整个表的情况(本来应该是只锁住部分范围行)。
具体如:
delivery_id | createtime |
1 | 100 |
2 | 101 |
3 | 102 |
4 | 103 |
session1:
select delivery_id from table where createtime>102 for update;
session2:
select delivery_id from table where createtime<102 for update;(此时需要等待锁释放)
createtime字段是有索引的。
按理说这里是不用等待锁的。之前我有试过,但是环境可能不同(当时mysql的版本和具体的配置环境可能有所不同)。
后来网上说把数据量增大试试,然后我把数据增到5000行还是不行。发现问题在于我生成的记录中createtime的离散率太低,只有一条是100,101,102,其他都是103。后来重新生成数据把createtime随机生成。再试,这时候就正常的。
有人说是数据量少,mysql的执行计划会选择全表扫描,但是我用explain查看是有用到索引的。
第一次数据量增大到5000后估计也是执行计划选择的问题。
mysql排他锁遇到的一个问题 小记
标签: