[英]Call @Transactional annotated method from another @Transactional annotated method
當我從另一個事務方法調用一個事務方法時,會發生什么,現在我的第二個事務方法已經完成,並且它在第一個事務方法中返回,並且不幸的是它失敗了,所以它將回滾所有內容,意味着它將回滾第二個事務方法更改?? 注意:兩種方法都屬於同一類
@Transactional
public void method1(){
//do something
call method2();
//do something
...
...
failed here
}
@Transactional
public void method2(){
//do something
save()
}
那么在上面的例子中它會回滾我在第二個事務方法中保存的內容嗎?
這取決於txType。 默認情況下,它是必需的。 因此第一種方法啟動事務,同一事務用於調用method2。
還要注意,同一對象內的方法調用不會觸發事務處理。 通常,事務處理作為代理處理,僅在調用注入的其他bean時才起作用。 在你的例子中,你不會注意到差異。
這很重要的情況是,如果method1不是@Transactional而method2是。 在這種情況下,根本就沒有交易。
如果兩個方法都在同一個類中, 則從同一個類的另一個方法調用時甚至不會考慮@Transactional
注釋。 你把它放在那里,或者即使你把它放在一邊並不重要。 仍然會有一個由method1()
啟動的事務,但是你會陷入該事務中。
如果第二個方法在一個單獨的類中,你可以使用Propagation.REQUIRES_NEW
讓它在自己的事務中運行,這意味着即使稍后的method1()
失敗, method2()
任何更改仍然會發生。
如果不存在,則REQUIRED
的默認事務傳播將啟動新事務,或者加入現有事務。 同樣,在單獨的類情況下,當method1()
失敗時,它會導致回滾method2()
所做的任何更改。
Spring引導提供了使用@Transactions進行傳播的概念。 傳播級別決定內部事務應該是同一個外部事務的一部分,或者應該是不同的事務。 默認情況下,傳播級別為REQUIRED ,這意味着內部事務將是同一外部事務的一部分,因此如果內部事務失敗,則整個事務將獲得回滾。
現在重要的是要知道Rollback默認只適用於運行時異常。 對於已檢查的異常,您必須明確指定@Transcations(rollbackFor = Exception.class)
所以回答你的問題是肯定的! 它執行內部事務所做的回滾更改。
發生的情況取決於所選的事務傳播。 默認值為:“REQUIRED”表示如果不存在任何事務,則將啟動它。
因此,在您的代碼中,method2將加入為method1創建的現有事務。
至於你在同一個類中使用這兩個方法的情況,要小心,因為Spring代理對象的工作方式不會像你期望的那樣工作。
這取決於您的transaction propagation
配置。
相關官方文檔在這里
只需注意圖表,傳播定義了一個事務的“事務上下文”。
這是一個典型的問題:
this
表示法,因為另一種方法將調用method2並避免調用代理對象方法,它包含所有事務邏輯。
在代理模式(默認設置)下,只攔截通過代理進入的外部方法調用。 這意味着實際上,自調用目標對象中的一個方法調用目標對象的另一個方法,即使被調用的方法用@Transactional標記,也不會在運行時導致實際的事務。 此外,必須完全初始化代理以提供預期的行為,因此您不應該在初始化代碼中依賴此功能,即@PostConstruct
@Transactional
參數。 例如 - 使用PROPAGATION_REQUIRES_NEW
為@Transactional
嵌套方法創建新事務。 在官方文檔中查看更多信息
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.