【问题标题】:Should I put @Transactional annotation for submethods also in spring?我也应该在春季为子方法添加@Transactional 注释吗?
【发布时间】:2023-03-10 17:55:01
【问题描述】:

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

【问题讨论】:

  • 由于这些是公开的并且可以自己调用,我想您确实需要注释。只要确保他们没有不必要地创建自己的事务,并尽可能使用mainDbThings 事务。
  • 但如果它们是私有的,并且只能从主方法调用?删除方法有异常,写方法会回滚吗?
  • 澄清一下,如果方法是从 mainDbTings 调用的,则不需要这个,因为 mainDbTings 已经启动了一个事务(如果有的话)。但是,这些方法应该是私有的。如果它们可以在不通过 mainDbTings 的情况下被调用并且应该是事务性的,那么它们也应该被注释。

标签: java spring transactions rollback transactional


【解决方案1】:

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

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


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

并调用ma​​inDbTingswriting 上的@Transactional 无效。这意味着为mainDbThings 启动的事务仍将以书面形式存在/打开。所以在这种情况下你可以很容易地放下它。

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

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

【讨论】:

【解决方案2】:

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

我希望现在很清楚。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-02-05
      • 1970-01-01
      • 2022-11-21
      • 2015-09-18
      • 2018-02-23
      • 2015-10-06
      • 2013-11-12
      • 1970-01-01
      • 2020-02-02
      相关资源
      最近更新 更多