生产异常 Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceed

1、程序中报错日志:

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

grep "MySQLTransactionRollbackException"   *_2021-09-10.9.log

 查找第一次出现位置:grep -C 100 "MySQLTransactionRollbackException" 

 *_2021-09-10.9.log | head -201 


 

2、查看未提交事务:

select * from  information_schema.INNODB_TRX;

SELECT 
    a.id,a.user,a.host,b.trx_started,b.trx_query 
FROM information_schema.processlist a RIGHT OUTER JOIN information_schema.innodb_trx b
ON a.id = b.trx_mysql_thread_id;
 

3、手动执行该update语句,失败,等待锁超时:

update orders set *** where id='79302e18a8e848ccb2323c48ca4ca349';

update orders set *** where id='aeff09dbbc1a4668bf959f675d536ece';

4、由于是生产,客户急需处理业务数据,所以临时解决方案,是先kill 掉,未能提交事务的线程,

kill  trx_mysql_thread_id(上图中的trx_mysql_thread_id是10, 所以 执行  kill  10)

5、准备在测试环境复现这个问题,测试开启之前,查询是否有未提交事务

6、测试环境查看:

-- 查看正在锁的事务(没有)
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; 

-- 查看等待锁的事务(没有)
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

7、测试环境,制造未提交事务,把程序debug挂起:

 再次查看:show PROCESSLIST

执行查询未提交事务语句:select * from  information_schema.INNODB_TRX;

SELECT 
    a.id,a.user,a.host,b.trx_started,b.trx_query 
FROM information_schema.processlist a RIGHT OUTER JOIN information_schema.innodb_trx b
ON a.id = b.trx_mysql_thread_id;
 

如上只是其中一种事务挂起情况,目前的解决方案,就是手动kill掉长期挂起,未提交的事务。

还有其他原因,比如手动开启事务,发生异常的时候没有进行回滚操作,导致事务挂起;

再比如,开启事务以后,强行kill掉程序或者宕机,也会导致事务挂起。

其他情况,欢迎补充;

1、事务过程中执行其他非数据库操作,导致事务长期未被处理。
2、事务处理异常或实现逻辑有误,导致事务未被正常处理。
3、网段异常导致应用端请求未被正常发送给数据库,数据库等待应用后续操作。
4、应用服务器性能问题(如CPU爆满),导致应用无法及时切换到该进程进行处理。

参考帖:https://blog.csdn.net/weixin_39827589/article/details/113489406

MySQL Transaction--查看未提交事务执行的SQL - TeyGao - 博客园

https://segmentfault.com/a/1190000022442121

MySql Lock wait timeout exceeded该如何处理? - 凝雨 - Yun

  • 9
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
根据引用中的描述,"com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction" 是一个错误的原因。这个错误通常发生在MySQL数据库中,当一个事务等待锁的超时时间超过了设定的限制时发生。为了解决这个问题,可以尝试重新启动事务,或者增加等待锁的超时时间。 根据引用中提到的方法,可以使用Navicat或者直接使用命令连接到数据库,然后运行"show PROCESSLIST"命令来查看是否有锁表的情况。这将显示当前正在执行的所有查询和其状态。通过分析这些信息,可以确定哪个查询正在持有锁并可能导致超时。 另外,在引用中提到了一些关于系统信息收集的变化,这可能会对问题的解决有所帮助。可以尝试更改系统的一些设置,例如增加系统的硬盘和CD/DVD测试的超时时间,以及处理视频播放时可能出现的错误报告。 综上所述,解决"com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction"错误的方法包括重新启动事务、增加等待锁的超时时间、检查是否有锁表的情况,并根据具体情况进行调整系统设置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [解决生产异常 Cause com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException Lock wait timeout ...](https://blog.csdn.net/zhiyikeji/article/details/124766592)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [BURNINTEST--硬件检测工具](https://download.csdn.net/download/emotion0501/8689891)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值