在事务中更新大量数据造成的锁等待超时和慢查询

根据公司SRE给出的慢查询记录:
在这里插入图片描述
我在Kibana中查到了相关的600多条日志:
在这里插入图片描述
根本原因在于某sql update,where id in的列表过长(多达几百),range过大的互斥锁不好申请(估计读已提交级别,update … where id in (…)采用的是间隙锁,查过一些资料,未能100%确认)。它所在的事务一直申请不到锁,就超时(默认50秒)报错了:

com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction

。而在宏观上,业务上又需要在一段时间内大量访问这段代码,就会反复产生大事务,加剧了锁的竞争,从而造成了慢查询。

一句话概括,大事务高并发

解决思路

拆分大事务

一些相关参考资料

Update和Insert操作与行锁表锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 MySQL ,插入数据也有可能导致表的情况发生,特别是在高并发的场景下。以下是一些可能导致表的情况及相应的解决方法: 1. 表级:当插入数据时,如果使用了表级(如写),其他事务无法同时对同一张表进行写操作,可能导致表。解决方法是尽量减少事务的持有的时间,将事务范围缩小到最小必要范围内。 2. 长事务:如果有一个事务在插入大量数据时持有资源,其他事务需要等待事务完成才能继续操作,可能导致表。解决方法是将长时间运行的事务拆分为多个较短的事务,减少冲突的可能性。 3. 索引问题:插入数据时如果存在较多的索引,会增加索引更新的开销,可能导致表。解决方法是合理设计索引,避免过多的冗余索引,并根据实际情况选择合适的索引类型。 4. 死:在并发环境下,多个事务相互等待对方释放资源,形成死现象,导致表。解决方法是合理设计事务操作的顺序,尽量避免交叉依赖的操作,或者通过设置事务超时时间、死检测和自动回滚机制来解决死问题。 5. 数据库配置:如果数据库的连接池设置不合理,导致连接数过多或者超时时间过长,可能导致表。解决方法是合理设置数据库连接池参数,限制最大连接数和连接超时时间,避免资源竞争和长时间占用资源。 总的来说,要避免由插入数据导致的表问题,需要合理设计事务范围、索引和数据库配置,并尽量减少事务持有的时间。同时,监控和调整数据库性能也是预防表问题的关键。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_23204557

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值