java - 在服务方法上使用@Transactional,它会更新多个存储库
问题描述
春季启动,postgres,春季jpa。
有一个服务,它试图跨多个存储库存储更改:
class Service {
@Transactional
public void doStuff() {
repo1.delete(...);
repo2.saveAll(...);
repo1.save(...);
}
}
如果出现任何故障,则需要回滚此操作。
在这里,我想到了两件事:
- 如果我
throw RuntimeException
在该方法中间的某个地方添加一个,那么它之前的所有内容都不会回滚。 - 在常规流程中,我得到
无法提交 JPA 事务;嵌套异常是 javax.persistence.RollbackException: Error while committing the transaction
我的配置是:
@Configuration
@EnableTransactionManager
@EntityScan
@EnableJpaRepositories
public class DataConfig {}
还尝试使用TransactionTemplate
bean 的execute
方法。设法克服了第一个问题,但第二个问题仍然失败。
解决方案
@Transactional(rollbackFor = Exception.class)
即使您的代码中有异常,您也可以尝试添加这将回滚
class Service {
@Transactional(rollbackFor = Exception.class)
public void doStuff() {
repo1.delete(...);
repo2.saveAll(...);
repo1.save(...);
}
}
推荐阅读
- ruby-on-rails - 如何克服 Excel CSV 编码的噩梦:使用 Ruby on Rails 从 ASCII-8BIT 到 UTF-8 的“\xEF”
- javascript - 如何替换 TXTextControl.web 中的图像
- python - Django 项目中的 Python 2 timezone.utc
- python - 将没有标题的json文件转换为csv
- python - pyRFC 无法通过 SNC 连接
- c - 使用 GNU MPZ 库进行模幂运算
- javascript - Javascript 将文本转换为粗体 unicode 字符集
- javascript - AnalyserNode 在什么时候执行它的 FFT?
- python - 将列表传递给类中的函数
- java - 这个 SpringBoot 注释中的这些花括号在做什么?