spring事務失效

2022-09-23 04:03:13 字數 1112 閱讀 4978

遇到的問題

​ 前端時間我在做乙個父子事務巢狀的時候,出現了子事務失效。在同類的子事務上加事務註解一直都不能建立事務,後來發現是子事務失效了。下面總結一下事務失效情況和解決經驗

事務失效有如下幾種情況:

沒有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...