【疑難雜症】記一次生產問題之事務超時


現象和猜測

我們每日日終跑批,跑批的第一步要去NFS文件系統檢查信貸還款文件的標志文件,即dbas.ok文件,以便做相關賬務處理,該代碼使用了while(true),直到file.exist()返回true之后才break

我們是每天晚上9點鍾定時跑批,有時候dbas.ok文件來得比較遲,比如第二天的零點之后才來。第二天我們就發現批量還一直還停留在這一步。

照理說文件雖然姍姍來遲,但並未缺席,為何沒有檢測到呢?

 

一開始我們以為是代碼BUG,但是始終測試不出來,測試環境我試過過了一個周末之后,再把dbas.ok文件放上去,依然能正常檢測到並繼續后續的批量步驟。

於是我又各種猜測,可能是NFS有什么貓膩,可能是拋了SecurityException線程死掉了,可能是其他線程占用了資源,使得該線程sleep結束之后一直阻塞

 

最后我看日志發現,是事務超時了。由於我們把每一個批量的一環,都放在一個事務中執行,服務器上事務的超時時間配的非0值(0值則永不超時),所以時間太長,就超時了。並且我就這個問題做了未驗證的猜測,即事務超時時並不會立即拋錯,而是commit的時候拋出錯誤

 

繼續深入

參考了http://www.importnew.com/2466.html

我們是這樣執行的事務:

TransactionTemplate transactionTemplate = BatchSupportor.getTransactionTemplate();
            transactionTemplate.execute(new TransactionCallback() {

                @Override
                public Object doInTransaction(TransactionStatus arg0) {
                    try {
                        略
                    } catch (Throwable t) {
                        if (!(t instanceof CoreTransactionException)) {
                            throw t;
                        }
                        logError(t, null);
                    }
                    return null;
                }
            });
其中transactionTemplate配置在xml文件中
<transactionTemplate id="transactionTemplate">
        <ref name="transactionManager">transactionManager</ref>
        <param name="propagationBehaviorName">PROPAGATION_REQUIRED</param>
        <param name="isolationLevelName">ISOLATION_READ_COMMITTED</param>
        <param name="readOnly">false</param>
        <param name="timeout">150</param><!-- in seconds -->
</transactionTemplate>
<transactionTemplate>是公司的自定義標簽,並且這里配置的超時時間是150秒
但當我在一個事務里sleep了三個小時以后,依然沒有報錯。可見該配置並沒有起到作用。接下來的日志我將要仔細復習一下事務與mybatis


免責聲明!

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



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