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