Java 我应该在spring中为子方法添加@Transactional注释吗?

Java 我应该在spring中为子方法添加@Transactional注释吗?,java,spring,transactions,rollback,transactional,Java,Spring,Transactions,Rollback,Transactional,我有一个主DB处理程序方法,它调用其他方法,这些方法也可以处理BD 我将@Transactional注释作为主方法,因为如果出现问题,我希望回滚所有内容 我的问题是:我应该把这个注释也放在子方法上,否则它会知道子方法是从一个事务性方法调用的 例如,在deleting方法中发生异常,如何确保写入部分也将回滚: @Transactional public void maintDbTings() { writing(); deleting(); } @Transactional //

我有一个主DB处理程序方法,它调用其他方法,这些方法也可以处理BD

我将@Transactional注释作为主方法,因为如果出现问题,我希望回滚所有内容

我的问题是:我应该把这个注释也放在子方法上,否则它会知道子方法是从一个事务性方法调用的

例如,在deleting方法中发生异常,如何确保写入部分也将回滚:

@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
注释的方法时开始事务。交易的范围 包括该方法的执行,该方法调用的任何方法的执行,以及 依此类推,直到方法返回。已配置资源所覆盖的所有托管资源 PlatformTransactionManager和您在事务作用域期间使用的参与 交易例如,如果使用
org.springframework.jdbc.datasource.DataSourceTransactionManager
,则从链接的
数据源检索的连接
自动参与事务。
事务以两种方式之一终止:要么方法直接完成执行并由事务管理器提交事务,要么方法抛出异常并由事务管理器回滚事务


我希望现在一切都清楚了。

如果您有以下内容,请用通俗易懂的英语说:

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


@Transactional //do I need this?
public void writing() {
    //no exceptions
}
并调用maindbings
写入
上的
@Transactional
无效。这意味着为
mainDbThings
启动的事务仍将以书面形式存在/打开。因此,在这种情况下,你可以很容易地放弃它

另一方面,由于
编写
是公共的,有人可能会认为它是事务性的,因为它很可能是一个服务类。在这种情况下,将
写入
成为
@事务性
是强制性的,您不能放弃它


所以,你的需要真的就来了

您可以使用传播属性,如REQUIRED、REQUIRES\u NEW,根据您的要求嵌套,如以下链接中所述:


由于这些是公共的,可以自己调用,我想您确实需要注释。只要确保他们没有不必要地创建自己的事务,并尽可能使用
mainDbThings
transaction。但是如果它们是私有的,并且只从main方法调用?如果删除方法有异常,写入方法会回滚吗?为了澄清,如果从maindbings调用方法,则不需要回滚,因为maindbings已经启动了事务(如果有)。但是,这些方法应该是私有的。如果可以不通过maindbings调用它们,并且它们应该是事务性的,那么还应该对它们进行注释。还可以使用
propagation
属性更改嵌套调用的事务。