1

在我的應用程序中,我對不同的方法有幾個@Transactional註釋。多個Spring @Transactional註釋在一個應用程序中?

他們使用Crud Repository在我的數據庫上執行刪除操作。我想知道在什麼階段做這些刪除得到執行,我需要所有@Transactional註釋?

例如,2刪除methods被後來被稱爲在façade method,外牆方法,然後調用在runner

1.方法1:

@Transactional 
public void deleteFromSchemaOne(){ 

} 

1.方法2:

@Transactional 
public void deleteFromSchemaTwo(){ 

} 

2.調用這2種方法在外觀方法:

@Transacational 
public void deleteFromAllSchemas(){ 

deleteFromSchemaOne(); 
deleteFromSchemaTwo(); 

} 

3.調用外牆方法亞軍

@Transactional 
    public void run(String... args) throws Exception { 

     service.deleteFromAllSchemas(); 


} 

我想知道的是:

我刪除的階段實際上是執行?該方法是否在Runner內完成?

編輯:

外牆方法與循環:

public void deleteFromAllSchemas() { 

    for(int i = 0; i < list.size(); i++){ 

    deleteFromSchemaOne(); 
    deleteFromSchemaTwo(); 

    } 

}

回答

3

當最外事務完成,所以run()後。其實它不是最外面的,它是唯一的交易。內部的@Transactionals不創建新的事務,他們只是加入現有的事務。

如果您需要確保在外部交易完成之前進行了一些更改提交,則需要使用@Transactional(propagation=Propagation.REQUIRES_NEW)設置交易傳播。這將創建一個新的事務,即使有一個已經存在的事務。

在您的示例代碼中(至少根據它包含的內容),run()方法可能不應該啓動事務。

如果我理解正確的,你想沿着

public void run() { 
    for(int i = 0;i < list.size(); i++) 
     service.deleteFromAllSchemas(i); 
} 

@Transactional 
public void deleteFromAllSchemas(int i) { 
    deleteFromSchemaOne(i); 
    deleteFromSchemaTwo(i); 
} 
+0

基本上線的東西我想要做的就是確保在deleteFromAllSchemas()方法是在架構一個和兩個務必transactional-即一切被刪除或什麼也沒有,我該怎麼做?謝謝你的幫助。 – java123999

+1

這是用你的'deleteFromAllSchemas()'中的'@ Transactional'完成的。如果發生錯誤,它將回滾在'deleteFromSchemaOne()'和'deleteFromSchemaTwo()'中完成的所有更改。你也應該真正閱讀交易。他們不是你希望得到正確的或「在工作中學習」的東西。 – Kayaman

+1

這是正確的。我想補充一點,一般來說,交易應儘可能短。因此,除非這些數據庫刪除彼此依賴(假設一個失敗,您將希望回滾整個事務),那麼您應該只註釋兩個刪除方法。這可以確保每次刪除都將在單獨的事務中運行。如果他們確實相互依賴。使用'@Transactional(propagation = Propagation.MANDATORY)'註釋調用它們的方法並選擇註釋刪除方法' –

相關問題