【问题标题】:Using @Transactional on service method, which updates multiple repositories在服务方法上使用@Transactional,它会更新多个存储库
【发布时间】:2020-05-13 10:05:05
【问题描述】:

Spring boot、postgres、spring jpa。

有一个服务,它试图跨多个存储库存储更改:

class Service {

    @Transactional
    public void doStuff() {
        repo1.delete(...);
        repo2.saveAll(...);
        repo1.save(...);
    }
}

如果任何失败,此操作需要回滚。

在这里我想到了两件事:

  1. 如果我在该方法中间的某处添加throw RuntimeException,则它之前的所有内容都不会回滚。
  2. 在常规流程中我得到 ​​li>

无法提交 JPA 事务;嵌套异常是 javax.persistence.RollbackException: Error while committing the transaction

我的配置是:

@Configuration
@EnableTransactionManager
@EntityScan
@EnableJpaRepositories
public class DataConfig {}

还尝试将TransactionTemplate bean 与execute 方法一起使用。设法克服了第一个问题,但第二个问题仍然失败。

【问题讨论】:

  • 您正在使用 Spring Boot,但是您的配置表明您正在努力解决 Spring Boot 自动配置问题。话虽这么说,这真的是您正在使用的代码还是潜伏着一些最终方法?还有你正在使用哪个数据库,而不是偶然 MySQL 和 MyISAM 表(不支持事务)。
  • 如果“工作区域”是指 EntityScan 和 JpaRepositories 注释,我使用它们来减少特定包的扫描半径(如果我正确理解它们的用法)。对于数据库 - 它是 postgres。对于我正在使用的代码 - 好吧,我知道我在使用 spring 数据时采取了一条小路,但这种方法是一个特定情况。所以是的,它是真实的,并且必须保持在同一条路线上。
  • 如果数据被持久化并且没有回滚你的@Transactional 不起作用。此外,您在提交时遇到错误这一事实告诉您一些事情(请添加完整的堆栈跟踪)。所以你一定是在做一些你没有说出来的事情。还如前所述,真实代码或伪代码被异常化以部分模仿实际代码? (您不会是第一个也是最后一个这样做的人,并且会犯错误导致无处可去!)。此外,您不需要 @EnableTransactionManagement,因为 Spring Boot 会处理这些问题。
  • 你在堆栈跟踪部分是对的。我认为我正在进行一些 jpa 验证,而 RollbackException 的原因确实是验证错误。对于@Transactional,是的,它不起作用。其原因是这样一个事实,即使用 InitializingBean 直接从同一个 bean 测试流是一个坏主意。将删除TransactionManager,谢谢。

标签: java spring-boot spring-transactions


【解决方案1】:

您可以尝试添加@Transactional(rollbackFor = Exception.class),即使您的代码中有异常也会回滚

class Service {

    @Transactional(rollbackFor = Exception.class)
    public void doStuff() {
        repo1.delete(...);
        repo2.saveAll(...);
        repo1.save(...);
    }
}

【讨论】:

  • 这是我的第一种方法,但问题是 - 我正在抛出 RuntimeException,根据 @Transactional.rollbackFor,它是默认捕获的。我确实设法找到了问题的路径,并且它与 AOP 更相关 - 如果在同一个 bean 中调用 @Transactional 则无法解决(我正在使用 InitializationBean 接口来测试流程)。跨度>
猜你喜欢
  • 2020-01-17
  • 2019-02-11
  • 1970-01-01
  • 2020-02-08
  • 2016-12-04
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
  • 2020-11-07
相关资源
最近更新 更多