2014-02-13 41 views
0

我已閱讀春天的有關Spring註釋@Transactional(Propagation.REQUIRED)通過一個方法,它的行爲如何?

@Transactional(Propagation.REQUIRED)的官方文檔

註釋,但仍然有一些疑問。我會告訴你關於我是怎麼想的,它的行爲的例子:

首先服務

public class MyServiceImpl implements MyService{ 

@AutoWired 
private OtherService otherService; 

@Transactional(Propagation.REQUIRED) 
public void saveItem(Item item){.....} 

@Transactional(Propagation.REQUIRED) 
    public void updateItem(Item item){....} 
} 

@Transactional(Propagation.REQUIRED) 
public void deleteItem(Item item){ 
    otherService.checkItem(item); 
........... 
} 
} 

第二業務

public class OtherServiceImpl implements OtherService { 



    @Transactional(Propagation.REQUIRED) 
    public void checkItem(Item item){.....} 


} 

從Spring撥打電話到MyServiceImpl類控制器:

  1. 如果我打一個電話給saveItem(),會創建一個新的物理和邏輯事務,對吧?

  2. 如果我從控制器向這個服務發出兩個調用,一個到saveItem(),而另一個到updateItem(),Spring會爲每個方法創建兩個物理不同的事務,對不對?

  3. 如果我做出deleteItem()一個電話,只將創建一個物理事務,因爲它會打開的時候deleteItem被稱爲交易,但此方法來otherService.checkItem()內部通話將重用第一個實物交易,對不對?

+0

是的,你是對的http://stackoverflow.com/questions/10740021/transactionalpropagation-propagation-required –

回答

0

REQUIRED意味着需要爲運行方法一個事務,因此,如果一個不是在一個新創建的方法的beggining然後已經正在進行(REQUIRED是默認傳播模式):

1)不必要的,如果這是從一個已經有一個正在進行的交易中調用的方法

2)取決於控制器是否是事務性的。不應該按照慣例,只有服務層應該定義事務的範圍。所以在非交易型控制器的通常情況下,您將有兩筆交易。

3)取決於呼叫是在哪裏進行的交易已經在進行中。如果是這樣的話,那麼這兩種方法都會加入一個新的事務,如果沒有刪除的話會創建一個事務,其他服務將繼續使用它

相關問題