2017-03-07 150 views
2

我有一個主要的DB處理程序方法,它調用其他方法,這些方法也與BD事情一起工作。我是否應該在春季也爲子方法添加@Transactional註解?

我把@Transactional註釋的主要方法,因爲我想回滾一切,如果出現問題。

我的問題是:我是否應該將這個註解也用於子方法,或者它會知道子方法是從事務性方法調用的。

例如,在刪除方法發生異常時,我如何才能確保寫入的部分也將被rollbacked:當它遇到與@Transactional註釋的方法

@Transactional 
public void maintDbTings() { 
    writing(); 
    deleting(); 
} 

@Transactional //do I need this? 
public void writing() { 
    //no exceptions 
} 

@Transactional //do I need this? 
public void deleting() { 
    //exception occurs 
} 
+0

由於這些都是公開的,可以自行調用,我想你做需要註釋。只要確保它們不會不必要地創建自己的事務,並且儘可能使用'mainDbThings'事務。 –

+0

但如果他們將是私人的,並只從主要方法調用?如果刪除方法有例外情況,寫入方法是否會回滾? – victorio

+1

爲了澄清,如果方法是從mainDbTings調用的,則不需要該方法,因爲如果有的話,mainDbTings已經啓動了一個事務。但是,這些方法應該是私人的。如果可以在不通過mainDbTings的情況下調用它們並且應該是事務性的,那麼它們也應該被註釋。 –

回答

4

春天開始一個事務。交易的範圍 包括該方法的執行,該方法調用的任何方法的執行,等等,直到該方法返回。已配置的 PlatformTransactionManager涵蓋的任何託管資源以及您在事務處理範圍內使用的受管資源均參與 事務。例如,如果使用org.springframework.jdbc.datasource.DataSourceTransactionManager,則從鏈接中檢索的連接DataSource 將自動參與該事務。 事務終止以下兩種方式之一:該方法直接完成執行並且事務管理器提交事務,或者該方法拋出異常並且事務管理器將事務處理回滾。

我希望現在很清楚。

3

在簡單的英語,當你有這樣的:

@Transactional 
public void maintDbTings() { 
    writing(); 
} 


@Transactional //do I need this? 
public void writing() { 
    //no exceptions 
} 

並調用mainDbTings,在writing@Transactional沒有效果。這意味着mainDbThings開始的交易仍將以書面形式呈現/開啓。所以在這種情況下,你可以輕鬆地放棄它。

在另一方面,因爲writing是公共有人可能稱之爲期待它是事務性的,因爲它是一個服務類最有可能。在這種情況下,使writing@Transactional是強制性的,您不能刪除它。

因此,它確實滿足了您的需求。

+0

也可以使用'propagation'屬性來改變嵌套調用的事務。 http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/annotation/Transactional.html –

相關問題