![](/img/trans.png)
[英]Lock wait timeout exceeded; try restarting transaction Java with spring and Mysql
[英]java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction exception occur in MYSQL
我在MYSQL中使用表名“ test”,該表在事務T1中被鎖定,該事務將在20分鍾內完成。 當我在這20分鍾內通過另一個事務T2更新此表時。 我有一個例外:
11:58:38,584 ERROR [STDERR] java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
11:58:38,584 ERROR [STDERR] at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2928)
11:58:38,584 ERROR [STDERR] at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1571)
11:58:38,584 ERROR [STDERR] at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1124)
11:58:38,584 ERROR [STDERR] at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:676)
請提供解決方案,說明如何在不發生此異常的情況下執行此事務T2?
更新mysql數據庫中的innodb_lock_wait_timeout的值以解決此異常是否正確。 我期待着獲得針對此問題的任何有用的解決方案。
更新innodb_lock_wait_timeout的值不是解決此問題的正確方法。 對於初學者,您聽起來好像需要將其更新為20分鍾,這太荒謬了。
innodb_lock_wait_timeout的默認值為50秒-這是T2在放棄之前等待等待T1鎖定的表的訪問的時間(並導致您看到的異常)。
您的T2交易在做什么? 如果它僅執行只讀操作(即不將其寫入表“ test”),則可以將數據庫的隔離級別更改為“讀取未提交”,以便T2可以讀取未提交的數據。 但是,IMO這是您應避免的黑客。
相反,您應該考慮自己的設計/實現。 要使事務處於打開狀態並保持20分鍾的行鎖,這是在多線程環境(例如webapp)中提出的問題。
您的歸檔活動(需要20分鍾)是否必須進行一次交易? 解決此問題的一種明顯方法是在每個語句之后提交或將其分解為更合理大小的事務。
重新啟動您的本地mysql以避免此類問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.