MySQL报错Lock wait timeout exceeded怎么办
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL报错Lock wait timeout exceeded怎么办相关的知识,希望对你有一定的参考价值。
登录到mysql后,输入命令:show processlist;查看当前会话列表,左边红框是会话执行的命令,右边红框是会话的时间。通常会话时间太长的多半是因为锁等待活死锁造成的,但也不排除一些慢查询。
我们删除那些时间过长的会话。
MySQL报错Lock wait timeout exceeded怎么办
2
输入命令:kill 1110;
删除会话列表中等待时间最长的会话
MySQL报错Lock wait timeout exceeded怎么办
3
依次删除其他等待时间过长的会话 参考技术A 执行MySQL命令: show full processlist;
然后找出查询语句的系统id:kill掉被锁住的线程id
查看事物表: select * from information_schema.innodb_trx;
9. Lock wait timeout exceeded
一、 现象
用户打开消息推送有概率报错,后续发现推送消息阅读数、点赞数无法正常更新,mysql报警有行锁,
DBA抓到有锁表语句,kill该语句未正常恢复,elk日志有大量的java.sql.SQLException: connection holder is null 重启应用恢复
二、分析
根据elk日志,出现cause by Lock wait timeout exceeded 的异常,经检查代码发现,有部分代码手动开启事务begin,但是走入分支造成结果却未提交事务。
使得数据被锁长时间不能释放,(而系统当前也未做超时断开处理,导致异常情况发生时自愈能力不足)造成连锁反应,导致业务受到影响,最终引发系统崩溃。
三、解决方法
1.根据异常日志 connection holder is null,添加相关断开配置
druid remove-abandoned:true remove-abandoned-timeout:45000
注意:如果存在长事务可能存在链接强行被回收的情况。
2.spring框架管理事务
(1)基于注解
<!-- 添加事务管理器组件DataSourceTransactionManager --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 使用set方法注入数据源 --> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 开启基于注解声明式事务 注意配置transaction-manager属性,它引用了我们事务管理组件对象,这里要和事务管理器组件id一致 默认是transactionManager --> <tx:annotation-driven transaction-manager="transactionManager" />
(2)基于xml
<!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 装配数据源 --> <constructor-arg name="dataSource" ref="dataSource"></constructor-arg> </bean> <!--使用xml配置事务方法 --> <aop:config> <!-- 设置添加事务的方法,使用切入点表达式--> <aop:pointcut expression="execution(* *.checkout(..))" id="mypoint"/> <!-- 将事务方法和事务的相关配置关联起来 --> <aop:advisor advice-ref="myAdvice" pointcut-ref="mypoint" /> </aop:config> <!-- tx配置事务的属性 (使用tx名称空间)--> <tx:advice id="myAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 配置事务的属性,多个事务方法也可以在这个里面放,name设置事务方法名,propagation设置事务相关信息 --> <tx:method name="checkout" propagation="REQUIRED"/> </tx:attributes> </tx:advice>
注意未被托管到的事务处理
以上是关于MySQL报错Lock wait timeout exceeded怎么办的主要内容,如果未能解决你的问题,请参考以下文章
Lock wait timeout exceeded; try restarting transaction-Mysql报错
MySQL报错Lock wait timeout exceeded怎么办
在mysql数据库中为啥经常报错:lock wait timeout exceeded,是啥原因引起的?该如何解决?
执行 update操作的时候有报错 ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction