当前位置:Gxlcms > 数据库问题 > mysql排他锁遇到的一个问题 小记

mysql排他锁遇到的一个问题 小记

时间: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排他锁遇到的一个问题 小记

标签:

人气教程排行