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 - 事务应该在一种方法中提交,但应该在执行数据库事务的其他方法中回滚的主要内容,如果未能解决你的问题,请参考以下文章

如果我开始事务但由于条件原因,我不应该这样做,我应该使用提交还是可以立即调用回滚?

Spring @Transactional 隔离传播

Spring事务使用注意事项

JDBC事务管理及SavePoint示例

Spring整合mybatis事务,事务怎么都不提交.我要疯了

Spring 事务控制-存储过程事务