异常:
org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been ed as rollback-only  
代码:    @Transactional
    public void foo() {
        try{
            bar();
        } catch (RuntimeException re) {
            // caught but not throw further
             
        }
         
    }
 
    @Transactional
    public void bar() {
         
    }
事务传播特性为Required
问题:
当在bar()方法中抛出RuntimeException 异常后,在bar()返回时spring标记了事务回滚状态,最终事务被回滚,即使捕捉了异常。如果一定要在bar方法里抛出RuntimeException异常,那我要怎么使事务不回滚呢?

解决方案 »

  1.   

    抛出的可能不是RuntimeException,试试catch一下Exception
      

  2.   

    @Transactional(readOnly = true, rollbackFor = RuntimeException.class)事务是可以配置遇到什么异常回滚的,,即rollbackFor = 这个属性。
     配置为RunTimeException时,就是遇到RunTimeException时就回滚
    如果你想写的是其他的Exception就自己替换,。。
    要是不好定义的话,,  可以选择自定义Exception。
      

  3.   

    额,忘了说明了一个重要问题:foo()与bar()两个不在同一个class中。如果是在同一个类中的话,好像是不会出现这种情况的。
      

  4.   

    @Transactional(noRollbackFor = {RuntimeException.class})
      

  5.   

    我的目的不是想在发生RuntimeException时不让事务回滚,而是想实现当自己把这个RuntimeException异常捕获后就别回滚了,如果不捕获就要回滚。其实如果这个异常不是在非本类的方法里抛出的话本身就是像我说的这样的。