Spring - 事务应该在一种方法中提交,但应该在执行数据库事务的其他方法中回滚
Posted
技术标签:
【中文标题】Spring - 事务应该在一种方法中提交,但应该在执行数据库事务的其他方法中回滚【英文标题】:Spring - Transaction should commit in one method but should rollback in other methods which does a DB transaction 【发布时间】:2019-05-13 05:40:23 【问题描述】:在我有一个场景的情况下,如何在 Java 中处理 Spring Transaction:
一个服务方法让我们说methodA()调用另一个方法——methodB()。 从methodB(),我正在做一个验证,如果验证结果为真,我将调用另一个methodC(),这个方法必须被提交,而所有其他方法应该得到回滚,即从methodA()和methodB()完成的事务必须回滚,但是必须提交methodC中的事务,并且不能回滚。
为了回滚我使用的事务 -
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
实时场景 -
当我执行交易时,我会尝试创建一些交易。基于这些交易,我检查其中一个值是否达到阈值点,我需要触发一封邮件。这封邮件是一个数据库事务。所有其他事务必须回滚,只有邮件事务必须持久化。
任何帮助表示赞赏。
编辑:-
类似的问题 -
commit changes in try-catch inside @Transactional
但这并不能解决我的问题。如果@Transactional 也在类级别和方法级别给出怎么办?
【问题讨论】:
【参考方案1】:在我看来,这样的代码
@Transactional(propagation= Propagation.REQUIRED)
public void methodA()
methodB();
public void methodB()
if(validtaion=true)
SeverB.methodC();
throw YourException;
// in ServerB.java
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodC()
// do your thing
而且,你最好测试一下它是否运作良好。
【讨论】:
我尝试过使用这种方法,但效果仍然不佳。有一个类级别的@Transaction,我在其中调用methodC()。我猜这可能是一个障碍。不知道如何解决这个问题:( 为了使aop工作。你需要把add @Transactional放在另一个类中。methodB和methodC不在同一个类中。 尝试在另一个类中使用@Transactional - 的methodC()。 我运行我的测试用例,它可以工作。您需要专注于您调用的第一个方法。这个方法把@Transactional.以上是关于Spring - 事务应该在一种方法中提交,但应该在执行数据库事务的其他方法中回滚的主要内容,如果未能解决你的问题,请参考以下文章
如果我开始事务但由于条件原因,我不应该这样做,我应该使用提交还是可以立即调用回滚?