Mysql导致锁表的几种情况

本文概述了MySQL在事务隔离级别下,由于无索引update和forupdate语句导致的锁表问题,以及如何通过添加索引、选择合适的索引来避免表锁升级。提到了B站UP主散装Java和IT老齐的相关视频作为参考资源。
摘要由CSDN通过智能技术生成

最近面试的时候有些会问到什么情况下会导致锁表,我查阅了一下资料,汇总情况如下,但可能也不一定齐全。以下情况都在RR事务隔离级别下测试。
1.update语句的where条件字段没有索引
sql语句
上面就是一个update语句例子,name字段是没有索引的

在这里插入图片描述
实际代码里xml里的语句是上面这样的,在第一个事务执行这个更新时,会锁表,执行期间,第二个事务执行这个sql会被阻塞,需等待第一个执行完后,第二个才会执行。
解决办法:给name字段加索引,第一个事务就不会锁表了。

2.MySQL在Select …for update语句时(当前读),用到索引可用时使用行锁索,不可用时使用表锁
下面两个查询,empno是主键,两次查询是没问题的。
在这里插入图片描述
在这里插入图片描述

下面根据dname去查,dname是没有索引的。
在这里插入图片描述
另外一个事务根据empno去查,被阻塞
在这里插入图片描述
解决办法:给dname字段加索引,这个和第一个情况是差不多的。

这里还有情况:如果查询的empno(例如empno=7521)是dname=‘SALES’里的还是会被锁住,因为第一个查询语句就是锁的dname=‘SALES’的数据,如果查询的empno(上面的7566)不是dname=‘SALES’里的不会被阻塞。

3.索引选择的问题
跟着上面的第二个问题,如果表中dname=‘SALES’的数据够多(大概20%),锁着这些数据的时候,mysql可能会升级为锁表(mysql认为表锁可能效率更高)。

在这里插入图片描述
怎么解决:强制走索引
在这里插入图片描述
或者有其他的条件来缩小数据范围
在这里插入图片描述
如果只是update语句,不会因为索引选择的问题而升级为表锁的,它还是会走索引,所以update没有这个问题。
在这里插入图片描述
总结在这
在这里插入图片描述
说明:以上资料参考B站up主:散装java,IT老齐视频。

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值