mysql 杀掉排它锁_mysql排他锁遇到的一个问题 小记

在MySQL 5.5.34版本中,使用`SELECT FOR UPDATE`出现间隙锁导致全表锁的问题。当数据的离散率较低时,即使有索引,MySQL可能选择全表扫描。通过增加数据量和提高数据的离散性,可以避免全表锁,确保正确的行级锁定。解释了间隙锁的工作原理,并探讨了执行计划与索引使用的关系。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值