首页 > 解决方案 > 在服务方法上使用@Transactional,它会更新多个存储库

问题描述

春季启动,postgres,春季jpa。

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

class Service {

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

如果出现任何故障,则需要回滚此操作。

在这里,我想到了两件事:

  1. 如果我throw RuntimeException在该方法中间的某个地方添加一个,那么它之前的所有内容都不会回滚。
  2. 在常规流程中,我得到

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

我的配置是:

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

还尝试使用TransactionTemplatebean 的execute方法。设法克服了第一个问题,但第二个问题仍然失败。

标签: javaspring-bootspring-transactions

解决方案


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

class Service {

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

推荐阅读