我是否应该在春季为子方法添加@Transactional注释?

时间:2017-03-07 09:36:08

标签: java spring transactions rollback transactional

我有一个主DB处理程序方法,它调用其他方法,这些方法也使用BD事物。

我为主方法添加了@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
}

3 个答案:

答案 0 :(得分:4)

Spring在遇到使用@Transactional注释的方法时开始一个事务。交易的范围 涵盖该方法的执行,方法调用的任何方法的执行,以及 等等,直到方法返回。配置所涵盖的任何受管资源 您在事务范围内使用的PlatformTransactionManager参与了 交易。例如,如果您使用org.springframework.jdbc.datasource.DataSourceTransactionManager,则会从链接的DataSource中检索连接 自动参与交易。 事务以两种方式之一终止:方法直接完成执行,事务管理器提交事务,或者方法抛出异常,事务管理器回滚事务。

我希望现在很清楚。

答案 1 :(得分:3)

用简单的英语,当你有这个:

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


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

并致电 mainDbTings @Transactional上的writing无效。意味着为mainDbThings启动的事务仍将以书面形式存在/打开。所以在这种情况下你可以轻松放弃它。

另一方面,由于writing 是公共,有人可能会将其称为期待它是事务性的,因为它最有可能是服务类。在这种情况下,将writing设为@Transactional是强制性的,您无法将其删除。

所以它确实满足了你的需求。

答案 2 :(得分:2)

您可以根据您的要求使用传播属性,如REQUIRED,REQUIRES_NEW,NESTED,如下所示:

http://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html