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

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后估计也是执行计划选择的问题。

 

posted on 2015-06-29 21:24  sezve  阅读(353)  评论(0编辑  收藏  举报