mysql中for update没有命中索引会锁表吗?

前天和同事饭后散步的时候他说使用for update如果没有命中索引就会锁表,刚好最近要写类似的代码,听了之后心有戚戚,于是乎来尝试一下。

表结构:
学生表
数据:
数据
第一个事务:SELECT * FROM student WHEREno= '325985' FOR UPDATE;
在这里插入图片描述
第二个事务:SELECT * FROM student WHEREno= '456325' FOR UPDATE;
在这里插入图片描述
可以看的出来,在第一个事务中,我只锁了no为325985的记录,但在第二个事务中,no为456325却无法查询,说明没有命中索引确实会锁表

加上索引后试试:
在这里插入图片描述
第一个事务:
在这里插入图片描述
第二个事务:
在这里插入图片描述
都可以查出来,说明没有锁表。

还有一种特殊情况,就是如果where之后的条件是索引,但数据是不存在的,这种情况会锁表吗?推论:既然数据不存在,那么也无法命中索引,那么也会锁表。不过不能光想不做,让我们一起试试吧。

加一个联合唯一索引:
在这里插入图片描述
第一个事务:SELECT * FROM student WHEREname= '李不飞' ANDno= '325985' AND gender = 2 AND class = 13 AND grade = 3 FOR UPDATE;

在这里插入图片描述
第二个事务:SELECT * FROM student WHEREname= '李飞飞' ANDno= '325985' AND gender = 2 AND class = 13 AND grade = 3 FOR UPDATE;
在这里插入图片描述
看来我的推论是错误的,如果这条数据不存在,是不会锁表的

结论:如果for update没有命中索引会锁表。

补充一点,update更新语句和for update机制一样,没有命中索引,同样会锁表。

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值