Spring事务传播机制问题

本文探讨了Spring框架中事务传播机制的问题,特别是当内外层方法同时使用@Transactional注解时,内部方法异常导致的事务回滚问题。分析了问题产生的原因,并提出了两种解决方案:一是将事务拆分为独立的单元,二是通过捕获异常并手动回滚的方式处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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函数进行失败回滚

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值