天天看点

Spring事务传播机制问题Spring事务传播机制问题

Spring事务传播机制问题

  • Question:当代码外层和内层使用Transation注解进行事务操作时,内层操作失败,抛出

    代码如下

@Transaction
methodA(){
   try{
       methodB(){
         throw new   Exception(e);
       }
   }catch(Exception e){
     logger.info("处理失败")!
   }
}
           
  • 出现异常信息:
javax.servlet.ServletException: org.springframework.web.util.NestedServletException: Request processing failed; 
nested exception is org.springframework.transaction.UnexpectedRollbackException: 
Transaction rolled back because it has been marked as rollback-only
           
  • 出现问题分析:

    当内部方法出错,导致内部事务认为应该回滚,事务处于回滚状态。向外部方法抛出异常,此时外部直接将异常处理,导致外部事物认为程序正常,事务可以提交,事务处于提交状态。此时外部事务和内部事务是同一个事务,因此该事务不知道是提交,还是回滚。

  • 解决方法

    1.将事务拆分

    TransactionA-start

    TransactionA-commit

    TransactionB-start

    TransactionB-commit

    2.在cathe中回滚事务。

    在cathe中手动调用rollback函数进行失败回滚

继续阅读