2017-03-07 146 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 –

相关问题