spring 如何检查@Transactional是否标记为回滚?

hwamh0ep  于 2023-02-18  发布在  Spring
关注(0)|答案(1)|浏览(121)

下面是我遇到问题的代码的基本结构。

@Transactional
void A(){
    B();
    // Can I identify transaction rollback here?
    APICall(); // THIS SHOULD NOT BE CALLED IF THE TRANSACTION FAILS
}

void B(){
   try{
       C() // throws Null Pointer Exception
    }catch(Exception e){
        // logs the details
    }
}

@Transactional
void C(){
   D() // throws Null Pointer Exception
}

整个问题是APICall方法A中的()()。如果事务失败,则不应调用该API。()不捕获D引发的异常(),交易(方法C()),因此外部事务(方法A())也将被标记为回滚。但由于方法B()捕捉到C()抛出的NullPointerException,指令在方法A()中继续执行,调用APICall()方法,但方法A()的事务会回滚,因为内部事务回滚了。
那么,是否有办法检查方法A()的事务是否在方法A()内部被标记为回滚?这样我就可以阻止APICall?或者唯一的办法是在方法B()中重新抛出捕获的异常?

bjp0bcyl

bjp0bcyl1#

你现在的做法,我觉得有几个问题。

  • B()中的异常被消耗,这是不好的。why consuming exception is bad
  • 异常情况在A()中没有得到正确处理(当B()中存在异常时),这破坏了异常的全部用途
  • 因为您有多个B()方法,所以在单个A()中处理来自所有这些方法的响应看起来会非常难看。

为什么你要避免使用异常的原因和构建异常的原因一样呢?这种情况需要异常,因为异常不仅可以中断流程,还可以提供完整的堆栈跟踪,这样你就可以更好地处理这种情况。

相关问题