mybatis 执行插入操作,insert 返回1,数据库中无数据。数据库中数据的创建时间和插入执行时间不一致。
大家好,我是烤鴨:
? ? ?今天記錄一下線上的問題,由于不是我們組的代碼,所以沒參與全程,只是最后有幸聽各位大佬探討解決方案。mybatis 執行插入操作,insert返回1,日志記錄和接口返回都正常,但是數據庫中無數據。
?
1.場景介紹
? ? 該接口是一個從mq中消費數據的接口,每消費一條記錄,數據庫插入一條數據(無事務)。項目上線后,不定時會出現Mybatis日志插入成功,但是數據庫中無數據的情況。每次重啟之后就好了,但是不知道過多久又不行了。問了DBA,當時執行的操作線程正常,鎖釋放情況正常,是交替執行,就是insert語句確實是一條一條執行的,并無死鎖情況,但是binlog中無數據。
? ? 后來開發人員又說,mybatis打印的sql語句的時間和數據庫的創建時間不一致,有時候相差兩小時。
?
2.思路
? ? ?從上面的場景,基本能看出來是sql執行了,事務沒有commit。有大佬說是不是某個版本的mybatis的bug或者項目打包不完整,又一起縷了下當時的接口代碼,雖然業務邏輯比較重,簡單來說,還是校驗參數后生成數據入庫,不會產生數據庫死鎖。
? ? ?
3.解決
? ? ?當時一直在看問題接口,也沒想過其他的。有位大佬找了項目的其他代碼,發現了問題。由于同一個項目,單一數據源,共用一個事務管理器 transactionManager。其他的接口有手動開啟事務,但是try catch沒有finally,出現異常,一直報這個錯,Lock wait timeout exceeded; try restarting transaction。導致沒有釋放事務管理器,所有的sql操作都卡在這。
? ? 查了一下第一次出現有日志無數據的地方的日志,附近1千行沒有類似錯誤,附近5k行發現了,確實是這個問題。
?
4.總結
? ? ?先不討論為什么要手動開啟事務,如果事務手動開啟了,一定要記得關閉。如果用到了try catch 必須加finally。
? ? ?其次,這個問題發生了好幾次,每次都嘗試了解決方案,比如在將myabtis日志級別改為debug,問題方法改為手動事務(原來是無事務)等等,都沒有解決。還是日志分析的不夠。如果能多看一點日志(多幾千行),說不定就能發現問題了。
? ??
總結
以上是生活随笔為你收集整理的mybatis 执行插入操作,insert 返回1,数据库中无数据。数据库中数据的创建时间和插入执行时间不一致。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ map注意事项
- 下一篇: Amoeba for MySQL