遇到的問題
前端時間我在做乙個父子事務巢狀的時候,出現了子事務失效。在同類的子事務上加事務註解一直都不能建立事務,後來發現是子事務失效了。下面總結一下事務失效情況和解決經驗
事務失效有如下幾種情況:
沒有transaction註解
事務沒有丟擲runtimeexception異常到方法上
方法內丟擲runtimenexception的父類異常,也就是error、exception等
同類方法中相互呼叫,事務失效
造成這麼多種類的事務失效的主要原因是spring的動態**,原因如下:
動態**方法的異常抓取
預設只抓取runtimeexception,所以發生異常前的執行的crud操作還是會被提交的可以通過@transaction 的 roolbackfor屬性來指定其他異常
哪些方法能被動態**
spring的aop**,只能**public訪問級別的方法,其中final等關鍵修飾的方法是不能被**的。
怎麼呼叫**的方法
spring的aop**機制,同類的方法之間呼叫,呼叫的方法是不會被**的。比如a類呼叫b類方法(其中b的方法帶有增強的註解),b類中被呼叫的方法會被**並增強。但是在b類增強的方法直接呼叫b類的其他方法(同樣方法帶有增強的註解),此方法將不會被增強。可以通過(b)aopcontext.currentproxy()來解決此問題,該操作會拿到當前**類,然後就可以呼叫想呼叫的方法。
事務失效解決流程
結合此次經驗,事務失效總結分為一下三部
檢查方法關鍵字,判斷方法是否被**
在方法上打斷點 執行transactionaspectsupport.currenttransactionstatus(),獲取當前方法的事務狀態,沒有事務將會丟擲異常。判斷父子事務,只用判斷物件是不是乙個,也就是位址是不是相同。
當上面可以獲得事務物件,說明當前存在事務,通過事務物件位址來判斷是**不存在事務,父子方法呼叫,子方法沒有註解,父類有,事務還是會公用的。所以我們一步步排除還是容易查詢出來。
Spring 事務失效
1.丟擲檢查異常導致事務不能正確回滾 service public class service1 2.業務方法內自己 try catch 異常導致事務不能正確回滾 service public class service2 catch filenotfoundexception e 解法2 手動設定...
Spring事務失效總結
每天多學一點點 話不多說,這就開始吧 3.propagation.requires new 4.結語 年底太忙,沒什麼時間研究細節。近兒得空,看了看之前寫的 細想之下,發現很多事務其實沒生效。細思極恐,在這裡記錄一下,方便日後複習。transactional propagation propagat...
Spring事務失效原因詳解
spring事務依賴的是資料庫的事務,在開發中如果沒有處理好,可能會遇到事務失效的情況,本文就盤點spring事務會失效的一些情況並給出解決方案。spring事務分為宣告式事務和程式設計時事務兩種。看下宣告式事務。使用 transactional做宣告式事務的一些說明 使用 transactiona...