我是否也应该在 spring 中为子方法添加 @Transactional 注释?

Should I put @Transactional annotation for submethods also in spring?

我有一个主要的 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
}

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

我希望现在清楚了。

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

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


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

并调用mainDbTingswriting上的@Transactional没有效果。这意味着为 mainDbThings 开始的交易仍将是 present/open 的书面形式。所以在这种情况下你可以很容易地放弃它。

另一方面,由于 writing 是 public 有人可能会称它为 期望 它是事务性的,因为它很可能是一项服务 class。在这种情况下,将 writing 设为 @Transactional 是强制性的,您不能删除它。

所以这真的取决于您的需求。

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

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