簡體   English   中英

@Transactional 方法調用另一個沒有@Transactional 注釋的方法?

[英]@Transactional method calling another method without @Transactional anotation?

我在服務 class 中看到了一個方法,它被標記為@Transactional ,但它也在同一個 class 中調用了一些其他方法,這些方法沒有被標記為@Transactional

這是否意味着對單獨方法的調用導致應用程序打開與數據庫的單獨連接或暫停父事務等?

沒有任何注釋的方法的默認行為是由另一個帶有@Transactional注釋的方法調用的?

當您在事務塊中調用沒有@Transactional的方法時,父事務將繼續執行新方法。 它將使用來自父方法的相同連接(使用@Transactional ),並且在被調用方法中引起的任何異常(沒有@Transactional )將導致事務按照事務定義中的配置回滾。

如果您在同一個實例中從帶有@Transactional的方法調用帶有@Transactional注釋的方法,則被調用的方法的事務行為不會對事務產生任何影響。 但是,如果您從另一個具有事務定義的方法調用具有事務定義的方法,並且它們在不同的實例中,則被調用方法中的代碼將遵循被調用方法中給出的事務定義。

您可以在spring 事務文檔聲明性事務管理部分找到更多詳細信息。

Spring 聲明性事務 model 使用 AOP 代理。 所以 AOP 代理負責創建事務。 僅當從實例外部調用實例中的方法時,AOP 代理才會處於活動狀態。

  • 這是否意味着對單獨方法的調用導致應用程序打開與數據庫的單獨連接或暫停父事務等?

這取決於傳播水平 以下是所有可能的級別

例如,如果傳播級別是NESTED ,則當前事務將“暫停”並創建新事務(注意:嵌套事務的實際創建僅適用於特定事務管理器

  • 沒有任何注釋的方法被另一個帶有 @Transactional 注釋的方法調用的默認行為是什么?

默認傳播級別(您稱之為“行為”)是REQUIRED 如果調用了帶有@Transactional注釋的“內部”方法(或通過 XML 以聲明方式進行事務處理),它將在同一個事務中執行,例如“沒有新內容”被創建。

@Transactional 標記事務邊界(開始/結束),但事務本身綁定到線程。 一旦事務開始,它就會在方法調用中傳播,直到原始方法返回並且事務提交/回滾。

如果調用具有@Transactional 注釋的另一個方法,則傳播取決於該注釋的傳播屬性。

如果內部方法沒有使用@Transactional 注解,內部方法將影響外部方法。

如果內部方法也使用帶有REQUIRES_NEW的 @Transactional 注釋,則會發生以下情況。

...
@Autowired
private TestDAO testDAO;

@Autowired
private SomeBean someBean;

@Override
@Transactional(propagation=Propagation.REQUIRED)
public void outerMethod(User user) {
  testDAO.insertUser(user);
  try{
    someBean.innerMethod();
  } catch(RuntimeException e){
    // handle exception
  }
}


@Override
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void innerMethod() {
  throw new RuntimeException("Rollback this transaction!");
}

內部方法使用REQUIRES_NEW進行注釋並引發 RuntimeException,因此它將其事務設置為回滾,但不會影響外部事務。 外部事務在內部事務開始時暫停,然后在內部事務結束后恢復。 它們彼此獨立運行,因此外部事務可以成功提交。

暫無
暫無

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

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