關於數據庫mysql死鎖:MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction


 

現場:

om.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_181]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_181]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_181]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_181]
at com.mysql.jdbc.Util.handleNewInstance(Util.java:404) ~[mysql-connector-java-5.1.38.jar!/:5.1.38]
at com.mysql.jdbc.Util.getInstance(Util.java:387) ~[mysql-connector-java-5.1.38.jar!/:5.1.38]
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:946) ~[mysql-connector-java-5.1.38.jar!/:5.1.38]
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3878) ~[mysql-connector-java-5.1.38.jar!/:5.1.38]
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3814) ~[mysql-connector-java-5.1.38.jar!/:5.1.38]
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2478) ~[mysql-connector-java-5.1.38.jar!/:5.1.38]

 

解決方案

1. 運行以下命令,查找提交事務的數據,殺掉線程即可解決
select * from information_schema.innodb_trx
kill thread_id;
2. 增加鎖等待時間,即增大下面配置項參數值,單位為秒(s)
3. innodb_lock_wait_timeout=500
3、優化存儲過程,事務避免過長時間的等待。

 

可以用下面三張表來查原因-information_schema:
       innodb_trx ## 當前運行的所有事務
       innodb_locks ## 當前出現的鎖
       innodb_lock_waits ## 鎖等待的對應關系

 

其他:

1、開始事務(使用@transtion)必須指定超時時間

@Transactional( rollbackFor = Exception.class , isolation = Isolation.REPEATABLE_READ, timeout = 30)
2、事務中 存在批量修改、刪除的語句的時候,where 條件盡量加索引

3、事務中 存在批量修改、刪除數據時,盡可能減少事務的執行時間

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM