zoukankan      html  css  js  c++  java
  • Spring事务与异常

    1. 在Spring的事务方法中,如果发生异常:
    • 异常不被try-catch捕获,此时事务管理器能感知到最初始的异常,故事务不能提交。
    • 异常被try-catch捕获并就地消化,此时事务管理器感知不到异常,故事务能提交。
    • 异常被try-catch捕获并再次手动抛出,此时事务管理器能感知到手动抛出的异常,故事务不能提交。
    • 异常被try-catch捕获并就地消化,同时显式地手动设置事务状态,TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();,事务不可提交。
    1. 带有事务传播行为的异常:
      最近在项目中遇到Transaction rolled back because it has been marked as rollback-only异常
      成因分析:
    • 方法outer()调用方法inner(),两个方法都有开启了事务,且方法B采用了默认的传播行为即required,在这种传播机制下,Spring发现方法B被方法outer()的事务包裹,inner()方法被融入outer()所在的外层事务。
    • 项目代码中,方法outer()里有人用try-catch包裹了对方法inner()的调用并简单的就地消化异常,若方法inner()执行出错,会将外层事务标记为rollback-only。
    • 但此时事务管理器由于没有感知到异常,就会继续执行逻辑,并提打算交事务,但在真正提交外事务之际,才检测到外层事务已被标记为rollback-only导致提交失败,所以就会抛出has been marked as rollback-only异常。
    • 这个异常源自事务管理器得到的事务状态与期望不一致,并且原始异常没有阻断逻辑的执行,而has been marked as rollback-only异常又没有反应真正的问题所在,所以需要加以修改并消除。
    • 消除方法还要从事务与异常的关系出发,让事务管理器感知到发生异常的原始点位,具体做法:

    1.不用try-catch包裹对子方法的调用。
    2.捕获并转换,再手动抛出。

    学习使我充实,分享给我快乐!
  • 相关阅读:
    281. Zigzag Iterator
    298. Binary Tree Longest Consecutive Sequence
    482. License Key Formatting
    361. Bomb Enemy
    373. Find K Pairs with Smallest Sums
    304. Range Sum Query 2D
    308. Range Sum Query 2D
    307. Range Sum Query
    303. Range Sum Query
    247. Segment Tree Query II
  • 原文地址:https://www.cnblogs.com/JaxYoun/p/13771592.html
Copyright © 2011-2022 走看看