Spring 事务传播和回滚行为

Spring Transaction propogation and rollback behaviour

@Service
public Class Demo(){

    @Transactional(rollbackFor=CustomException.class)
    @Override
    public RetunType methodONE()throws Exception{
        methodTWO();
        methodFIVE();
    }

    @Transactional
    @Override
    public RetunType methodTWO()throws Exception{
            methodFOUR();
            methodTHREE();
            throws new CustomException("error_msg");
        }

    @Transactional(propagation=Propagation.REQUIRES_NEW)
    @Override
    public RetunType methodTHREE(){
        .
        ..
        .
        ..
        .
    }
 }

 public Class CustomException  extends Exception{

    public CustomException(String msg){
        super(msg)
    }
 }

我不想只回滚我的 methodThree 事务。现在它正在回滚 methodTWO/THREE/FOUR/FIVE 中所做的所有更改。我无法进一步理解。

我正在尝试在所有其他方法和 methodThree() 中执行与事务相关的代码,这只是数据库中的状态更新。

如果我明白你在这里想做的是在它自己的事务中嵌套一个父事务,那么你的问题可能是这些方法在同一个 class .

这很重要,因为 Spring 应用 AOP 的方式,在本例中通过应用事务逻辑,使用代理来拦截方法调用。问题是方法调用是内部的或自调用的,因此永远不会通过代理。这意味着永远不会为 MethodThree() 创建新事务。

您有两个选择:

  1. 将方法三移至单独的 class。

  2. 将模式从代理更改为 AspectJ,这会将事务逻辑编织到 class 本身。

Spring Doc for @Transactional