• spring 声明式事务中try catch捕获异常


    原文:http://heroliuxun.iteye.com/blog/848122 

    今天遇到了一个这个问题

    最近遇到这样的问题,使用spring时,在业务层需要捕获异常(特殊需要),当前一般情况下不需要这样做的。具体如下:  在ServiceA类中有method1,在该方法中调用另一个ServiceB类的method2方法时(假定该方法抛出异常),method1方法捕获该异常但是没有向上抛出。spring提示:org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only

    原因是 先插入数据,然后调用另外一个service  加入事务  另外一个事务报错了,会抛这个异常  Transaction rolled back because it has been marked as rollback-only

    类似于你再get方法里面操作数据(非只读)的错

    业务场景: 在一个service里面先操作(增删改)数据之后,然后调用另外一个service(另外一个业务),而另外一个service抛异常,在你try catch这个业务的时候,spring默认会报 Transaction rolled back because it has been marked as rollback-only

    @Transactional(rollbackFor = Throwable.class)//默认事务传播方式required 
    public Class ServiceA { 
        
        @Autowired  
        private Dao dao; 
    
        @Autowired  
        private ServiceB serviceB;  // 注入另一Service Bean 
        
        public void method1() { 
    
            dao.insert(vo);  // 保存ServiceA的vo对象 
            try { 
                serviceB.method2(vo); // 保存ServiceB的vo对象 
            } catch (CustomException e) { 
                // 捕获自定义异常,但是没有向上抛出 
            } 
    
        } 
    } 
    
    
    以下是ServiceB的示例代码 
    @Transactional(rollbackFor = Throwable.class)//默认事务传播方式required 
    public Class ServiceB { 
        
        @Autowired  
        private Dao dao; 
        
        public void method2() throws CustomException { 
    
            dao.insert(vo);  // 保存ServiceA的vo对象 
        } 
    } 
    

      出现以上原因是spring执行method1方法时,开启一个新的事物,当调用method2方法时,当method2方法加入到method1方法的当前事务,当method2抛出异常,spring标记事务为回滚状态,method1方法捕获该异常,但没有抛出,spring会提交method1的事务,但spring发现该事务已经标记为回滚状态,而代码中却要提交事务,所以才会抛出以上的异常。  解决的方法:在ServiceB的method2方法上注解,告诉spring当该方法抛出自定义异常CustomException时,不要回滚事务,这样当该方法抛出异常时,spring不会标记事务为回滚状态。 

     @Transactional(noRollbackFor=CustomException.class)  public void method2() throws CustomException{  
    }

    感谢原文的博客

  • 相关阅读:
    移动端网页使用flexible.js加入百度联盟广告样式不一致问题解决
    flexible.js移动端适配安卓高分辨不兼容问题
    vue select二级城市联动及第二级默认选中第一个option值
    设置滚动条样式
    windows mongodb最常用命令简单归纳
    vue用阿里云oss上传图片使用分片上传只能上传100kb以内的解决办法
    vue实现文章内容过长点击阅读全文功能
    vue获取dom元素注意问题
    input框取消光标颜色手机端不生效
    基于 Vue.js 的移动端组件库mint-ui实现无限滚动加载更多
  • 原文地址:https://www.cnblogs.com/ChoviWu/p/9698817.html
Copyright © 2020-2023  润新知