版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接和本聲明。
本文連接:https://blog.csdn.net/qq_18860653/article/details/79907984
問題描述
在使用Spring 事務的時候,加上了timeout的限制,@Transactional(timeout = 10),發現事務不會由於超時回滾。數據庫
功能描述
所謂事務超時,就是指一個事務所容許執行的最長時間,若是超過該時間限制但事務尚未完成,則自動回滾事務。在 TransactionDefinition 中以 int 的值來表示超時時間,其單位是秒。
默認設置爲底層事務系統的超時值,若是底層數據庫事務系統沒有設置超時值,那麼就是none,沒有超時限制。.net
問題緣由
Spring事務超時 = 事務開始時到最後一個Statement建立時時間 + 最後一個Statement的執行時超時時間(即其queryTimeout)。因此在在執行Statement以外的超時沒法進行事務回滾。blog
解決辦法
舉個例子事務
@Transactional(timeout = 2, rollbackFor = Exception.class,isolation = Isolation.DEFAULT)
public void createOrder(Integer userId, Integer goodsId, Integer amount) throws Exception {
//減小庫存
int result = goodsDao.updateGoodsStock(goodsId, amount);
if (result != 1) {
throw new Exception("建立訂單失敗");
}
//製造異常
// int i = 1/0;
//插入訂單
orderDao.insert(userId, goodsId, amount);
Thread.sleep(3000);
}
在段代碼中,若是把Thread.sleep(3000);放到最後,並不會回滾。因此開發的時候要特別注意。若是真的有特別重要的操做(在最後一個Statement以後),我如今的解決辦法是,
* 儘可能在執行Statement的中間
* 在操做的最後再加一個無關的輕量Statement操做開發
原理
有時間在看,確定是Spring AOP裏面的it