gpt4 book ai didi

java - SpringBoot 2 事务传播嵌套不支持

转载 作者:太空宇宙 更新时间:2023-11-04 10:15:46 25 4
gpt4 key购买 nike

我有一个 SpringBoot 2 项目,我正在使用 spring data jpa 和 hibernate 以及 MySQL5.7

我在以下用例中遇到问题:我有一个调用另一个服务方法的服务方法。如果第二个服务的方法生成运行时异常,则第一个方法也被标记为回滚,并且我无法再提交内容。我只想回滚第二个方法,并仍然在第一个方法中提交一些内容。

我尝试使用propagation.NESTED,但是hibernate不允许嵌套事务(即使jpaTransactionManager支持它们并且MySQL支持保存点)。

我该如何解决这个问题?我可以以某种方式配置嵌套吗?

请记住,我需要第二种方法来查看第一种方法提交的更改,因此我无法将第二种方法标记为传播。REQUIRES_NEW

这是示例代码来澄清我的问题:

FirstServiceImpl.java

@Service
public class FirstServiceImpl implements FirstService

@Autowired
SecondService secondService;

@Autowired
FirstServiceRepository firstServiceRepository;

@Transactional
public void firstServiceMethod() {
//do something
...
FirstEntity firstEntity = firstServiceRepository.findByXXX();
firstEntity.setStatus(0);
firstServiceRepository.saveAndFlush(firstEntity);
...
boolean runtimeExceptionHappened = secondService.secondServiceMethod();
if (runtimeExceptionHappened) {
firstEntity.setStatus(1);
firstServiceRepository.save();
} else {
firstEntity.setStatus(2);
firstServiceRepository.save();
}
}

SecondServiceImpl.java

@Service
public class SecondServiceImpl implements SecondService


@Transactional
public boolean secondServiceMethod() {
boolean runtimeExceptionHappened = false;
try {
//do something that saves to db but that may throw a runtime exception
...
} catch (Exception ex) {
runtimeExceptionHappened = true;
}
return runtimeExceptionHappened;
}

所以问题是,当 SecondServiceMethod() 引发运行时异常时,它会回滚其操作(这是可以的),然后将其返回变量 runtimeExceptionHappened 设置为 false,但随后 firstServiceMethod 被标记为仅回滚,然后

firstEntity.setStatus(1);
firstServiceRepository.save();

未 promise 。

既然我不能使用嵌套传播,我怎样才能实现我的目标?

最佳答案

我建议您将它们分成两个单独的事务。

在第一个事务中,完成当前您想要提交的 firstServiceMethod 中的所有工作。 (例如通过 saveAndFlush)。现在,当您退出此方法时,更改将被提交,因此它们将可供后续调用使用。

然后让任何名为 firstServiceMethod 的内容调用一个新的事务方法 setFirstEntityStatus(),该方法调用 secondServiceMethod 并根据需要设置实体的状态。

基本上,不要尝试嵌套事务,而是将它们分成两个完全独立的事务,并使用排序来确保第一个事务的结果可用于第二个事务。

关于java - SpringBoot 2 事务传播嵌套不支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51748720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com