簡體   English   中英

從另一個@Transactional注釋方法調用@Transactional注釋方法

[英]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配置。

相關官方文檔在這里

https://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html#tx-propagation

只需注意圖表,傳播定義了一個事務的“事務上下文”。

這是一個典型的問題:

  1. 您應該通過自注入對象調用method2()或使用this表示法,因為另一種方法將調用method2並避免調用代理對象方法,它包含所有事務邏輯。

    在代理模式(默認設置)下,只攔截通過代理進入的外部方法調用。 這意味着實際上,自調用目標對象中的一個方法調用目標對象的另一個方法,即使被調用的方法用@Transactional標記,也不會在運行時導致實際的事務。 此外,必須完全初始化代理以提供預期的行為,因此您不應該在初始化代碼中依賴此功能,即@PostConstruct

  2. 嵌套事務行為取決於@Transactional參數。 例如 - 使用PROPAGATION_REQUIRES_NEW@Transactional嵌套方法創建新事務。 官方文檔中查看更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM