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

vic*_*rio 3 java spring transactions transactional rollback

我有一个主要的 DB 处理程序方法,它调用其他方法,这些方法也与 BD 事物一起工作。

我为 main 方法添加了 @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
}
Run Code Online (Sandbox Code Playgroud)

Eug*_*ene 6

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

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


@Transactional //do I need this?
public void writing() {
    //no exceptions
}
Run Code Online (Sandbox Code Playgroud)

并调用mainDbTings@Transactionalwriting没有影响。这意味着启动的事务mainDbThings仍将以书面形式存在/打开。因此,在这种情况下,您可以轻松删除它。

另一方面,由于writing 是公共的,有人可能会称它为期望它是事务性的,因为它很可能是一个服务类。在这种情况下作出writing@Transactional是强制性的,你不能放弃它。

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


Far*_*raz 5

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

我希望现在清楚了。