Lock wait timeout exceeded; try restarting transaction-Mysql報錯


一、問題由來

現在在做一個小程序的后台,使用Java寫的,數據庫使用的Mysql,之前一直調試的時候都好好的,今天在調試的時候突然就報一個錯:

### Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: update 表名 set update_time = now(), pet_state = ?, first_interaction_time = now(), stock_count = stock_count + 1, update_name = ? where pet_id = ?
### 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

因為做的這個業務操作比較復雜,這只是其中一個操作,里面又是新增,又是查詢,又是修改之類的,總之一大堆操作。

寫好代碼后也是自己第一次進行測試,怎么突然就報這個錯誤呢?大致意思就是:超過鎖定等待超時;嘗試重新啟動事務。

二、問題分析

拿到這個BUG,立馬使用搜索引擎進行搜索,網友給出了一些回答,有的說是在同一個事務之中,對同一個數據進行了新增和修改操作。

有的說是某一個事務執行的時間太長,直接kill掉即可。總之有一點,就是這個操作是在事務之中進行的,在執行過程中由於不知道的原因

導致執行過長最終出現問題。自己調試過兩三次都是同樣的結果,我索性就打個斷點進行調試,看看問題出在哪里,很幸運的是,很快找到

問題的原因。自己在一段代碼中由於不小心寫了一個無限循環,並且這個無限循環是在一個事務當中進行執行的,最終出現問題。
三、解決方案

 

 

 找到問題的原因后,立馬修改代碼,從新進行測試,問題解決。雖然問題是自己寫代碼時不小心導致的,但是也讓自己學習

到了一個新的知識點,Mysql的事務執行是有一個設定的時長的,如果超過這個時長就可能出現標題中的問題。吃一塹,長一智,

不斷學習,不斷進步!


免責聲明!

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



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