Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring事务传播和回滚行为_Java_Spring_Spring Mvc_Transactions_Spring Transactions - Fatal编程技术网

Java Spring事务传播和回滚行为

Java Spring事务传播和回滚行为,java,spring,spring-mvc,transactions,spring-transactions,Java,Spring,Spring Mvc,Transactions,Spring Transactions,我不想只回滚methodThree事务。现在它正在回滚方法2/3/4/5中所做的所有更改。我无法进一步理解 我尝试在所有其他方法中执行与事务相关的代码,在methodThree()中,它只是在DB中更新状态。如果我理解您在这里尝试的是让methodThree在父事务中嵌套的自己的事务中运行,那么您的问题可能是这些方法在同一个类中 这很重要,因为Spring应用AOP的方式,在本例中,通过应用事务逻辑,使用代理来拦截方法调用。问题是方法调用是内部的或是自调用的,因此从不通过代理。这意味着永远不会为

我不想只回滚methodThree事务。现在它正在回滚方法2/3/4/5中所做的所有更改。我无法进一步理解


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

如果我理解您在这里尝试的是让methodThree在父事务中嵌套的自己的事务中运行,那么您的问题可能是这些方法在同一个类中

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

您有两个选择:

  • 将方法3移动到一个单独的类中

  • 将模式从proxy更改为AspectJ,这将把事务逻辑编织到类本身中


  • 使用选项1,我的嵌套事务结果成功获得,我认为可能会成功。如果我的回答有助于解决您的问题,请将其标记为已接受。谢谢
    @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)
        }
     }