Spring事務採坑 timeout

2022-06-08 20:57:23 字數 855 閱讀 7402

功能描述

所謂事務超時,就是指乙個事務所允許執行的最長時間,如果超過該時間限制但事務還沒有完成,則自動回滾事務。在 transactiondefinition 中以 int 的值來表示超時時間,其單位是秒。

預設設定為底層事務系統的超時值,如果底層資料庫事務系統沒有設定超時值,那麼就是none,沒有超時限制。

問題原因

spring事務超時 = 事務開始時到最後乙個statement建立時時間 + 最後乙個statement的執行時超時時間(即其querytimeout)。所以在在執行statement之外的超時無法進行事務回滾。

解決辦法

舉個例子

@transactional(timeout = 2, rollbackfor = exception.class,isolation = isolation.default)

public void createorder(integer userid, integer goodsid, integer amount) throws exception

//製造異常

// int i = 1/0;

//插入訂單

orderdao.insert(userid, goodsid, amount);

thread.sleep(3000);

}在段**中,如果把thread.sleep(3000);放到最後,並不會回滾。所以開發的時候要特別注意。如果真的有特別重要的操作(在最後乙個statement之後),我現在的解決辦法是,

* 盡量在執行statement的中間

* 在操作的最後再加乙個無關的輕量statement操作

原理有時間在看,肯定是spring aop裡面的

採坑記錄switch坑

speed 0 switch speed speed 初始化為0後,你猜最終列印的結果是誰,最終列印的是150 因為switch條件的case判斷時只會有兩種結果,true false 初始化speed為0 走到第乙個case裡面,speed 不大於等於100 返回false,坑來了,因為初始值為0...

阿里分布式事務seata入門(採坑)

window系統直接雙擊執行上述服務端解壓包裡的seata server.bat,liunx系統執行seata server.sh這個,它預設開啟8091埠,配置檔案在 conf目錄下,主要需要修改的是file.conf和refistry.conf,之後會講到 如下圖目錄下除了common不需要執行...

Tomcat採坑記錄

關於編碼 tomcat容器執行環境有自己的預設編碼,跟本地main方法測試環境的預設編碼可能不一樣,有時候本地測試正確的同樣 放到tomcat容器裡面就會出現中文亂碼。本地測試正常 bufferedreader br new bufferedreader new filereader tes.txt...