Mysql 异常:Lock wait timeout exceeded; try restarting transaction

Mysql 异常:Lock wait timeout exceeded; try restarting transactionLock wait timeout exceeded; try restarting transaction

  • 错误日记
      • Cause: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
  • 问题原因分析
  • 解决方案

错误日记

Cause: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction

; SQL []; Lock wait timeout exceeded; try restarting transaction; nested exception is java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
at >org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:259) ~[spring-jdbc-4.2.1.RELEASE.jar:4.2.1.RELEASE]
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) ~[spring-jdbc-4.2.1.RELEASE.jar:4.2.1.RELEASE]
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:75) ~[mybatis-spring-1.3.0.jar:1.3.0]
at org.mybatis.spring.SqlSessionTemplate S q l S e s s i o n I n t e r c e p t o r . i n v o k e ( S q l S e s s i o n T e m p l a t e . j a v a : 447 )   [ m y b a t i s − s p r i n g − 1.3.0. j a r : 1.3.0 ] a t c o m . s u n . p r o x y . SqlSessionInterceptor.invoke(SqlSessionTemplate.java:447) ~[mybatis-spring-1.3.0.jar:1.3.0] at com.sun.proxy. SqlSessionInterceptor.invoke(SqlSessionTemplate.java:447) [mybatisspring1.3.0.jar:1.3.0]atcom.sun.proxy.Proxy35.update(Unknown Source) ~[na:na]
at org.mybatis.spring.SqlSessionTemplate.update(SqlSessionTemplate.java:295) ~[mybatis-spring-1.3.0.jar:1.3.0]
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:62) ~[mybatis-3.4.1.jar:3.4.1]
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53) ~[mybatis-3.4.1.jar:3.4.1]
at com.sun.proxy.$Proxy121.updateTmProcBase(Unknown Source) ~[na:na]

问题原因分析

字面原因理解就是锁等待时间超时了。
可能出现这种问题有以下几个场景:
1. 在同一事物内对同一条记录进行insert和update操作。
2. 分布式服务操作同一条记录。
3. 高并发。
上面这几种场景都有可能引起spring操作数据库死锁,而后抛出这个异常,Mysql数据库如采用InnoDB模式,默认参数:innodb_lock_wait_timeout设置锁等待的时间是50s,一旦数据库锁超过这个时间就会报错。

解决方案

  1. 查看mysql执行状态,看是否有执行缓慢的sql。
show  processlist;
  1. 查看当前运行所有事物,看事务表INNODB_TRX,里面是否有正在锁定的事务线程,看看ID是否在show processlist里面的sleep线程中,如果是,就证明这个sleep的线程事务一直没有commit或者rollback而是卡住了,我们需要手动kill掉就可以了
SELECT * FROM information_schema.INNODB_LOCK_waits

你可能感兴趣的:(Mysql)