Java 事务方法排除某些内部方法的回滚

Java Transactional method exclud rollback for certain inner method

提问人:Guillermo Nahuel Varelli 提问时间:10/26/2023 最后编辑:Guillermo Nahuel Varelli 更新时间:10/26/2023 访问量:27

问:

嗨,有以下代码片段,我想做的是拥有一个主要的事务方法 回滚所有插入,但我想避免回滚某些场景, 我的意思是做所有整个回滚所有其他嵌套方法,除了其中的一些

'公共类 myClass {

private DepositCancelledRepository depositRepo;

private DepositCancelledRepository depositCancelledRepo;

@DistributedLock(name = "mylocal", value = "#depositId")
@Transactional(rollbackFor = Exception.class, noRollbackFor = NoRollbackException.class)
public void outerMethod() {
        saveDeposit()
        saveDepositCancelled(depositCancelled);
        otherMethhods that will throw ex for rollback

}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void saveDeposit(DepositCancelled depositCancelled) {
        depositCancelledRepo.save(depositCancelled);

}

public void saveDepositCancelled(DepositCancelled depositCancelled) {

        depositRepo.save(depositCancelled);
}

}`

在这个例子中,我想避免回滚 saveDepositCancelled 即使 outerMethod 抛出异常,尝试使用 Propagation.REQUIRES_NEW 但如果外部方法失败,则不起作用,异常 saveDeposit 应该回滚并 saveDepositCancelled shoudld 不回滚

java spring-boot 事务 spring-transactions

评论


答:

0赞 Chasca 10/26/2023 #1

Spring 中的事务工作得益于代理。

因此,当您的方法 saveDeposit 或 saveDepositCancelled 被调用时,Spring 将看不到注释,因为您已经在代理实例中执行它们。

如果要实现这一点,则需要将代码分离在多个服务中,或者让一个服务从外部调用不同的方法。