【发布时间】:2020-05-13 10:05:05
【问题描述】:
Spring boot、postgres、spring jpa。
有一个服务,它试图跨多个存储库存储更改:
class Service {
@Transactional
public void doStuff() {
repo1.delete(...);
repo2.saveAll(...);
repo1.save(...);
}
}
如果任何失败,此操作需要回滚。
在这里我想到了两件事:
- 如果我在该方法中间的某处添加
throw RuntimeException,则它之前的所有内容都不会回滚。 - 在常规流程中我得到 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