mysql異常java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction:java
場景:mysql
1.開啓事務,更新本地數據庫;sql
2.調用銀行接口;數據庫
3.等待銀行接口返回結果,銀行返回成功,則提交事務;銀行返回失敗,則回滾更新本地數據庫事務spa
異常緣由分析:調用銀行接口等待時間過長,超過innodb_lock_wait_timeout閥值時,mysql的配置參數innodb_lock_wait_timeout閥值指的是事務等待獲取資源等待的最長時間,超過這個時間還未分配到資源則會返回應用失敗;當等待超過閥值時的狀況,當鎖等待超過設置時間的時候,就會報以下的錯誤;.net
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
解決辦法:設計
使用以下命令查看等待時間:rest
show global variables like '%wait%';blog
查看innodb_lock_wait_timeout的值,若是太小,能夠修改,增大其值,命令以下(設置等待時間50秒):接口
set innodb_lock_wait_timeout=50;
set global innodb_lock_wait_timeout=50;
總結:整個流程設計存在缺陷,很容易產生掉單,我的建議拆分業務,先調用銀行接口,銀行反饋信息直接告知用戶,若是支付失敗,提示用戶從新支付;若是支付成功後,出現更新數據庫操做按鈕供用戶操做。
參考:http://blog.itpub.net/12679300/viewspace-1418320/