繁体   English   中英

回滚 @Transactional 注释的方法

[英]Rollback a @Transactional annotated method

再会。 以下代码:

 class A{
     private B b;
    @Transactional
    public SomeResult doSomething(){
        SomeResult res = null;
        try {
          // do something 
        } catch (Exception e) {
            res  = b.saveResult();
        }
        return res ;
    }
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
class B{
  public SomeResult saveResult(){
      // save in db 
  }
}

据我了解,如果方法doSomething中存在异常,则事务不会回滚。 以及如何让它滚动? 并返回 SomeResult

您不应该以编程方式调用Rollback。 根据文档的建议,最好的方法是使用声明性方法。 为此,您需要注释哪些异常将触发回滚。

在你的情况下,这样的事情

@Transactional(rollbackFor={MyException.class, AnotherException.class})
public SomeResult doSomething(){
   ...
}

查看@Transaction API和有关回滚事务的文档。

如果,尽管有文档建议,您想要进行编程回滚,那么您需要按照已建议的方式从TransactionAspectSupport调用它。 这是来自文档:

public void resolvePosition() {
  try {
    // some business logic...
  } catch (NoProductInStockException ex) {
    // trigger rollback programmatically
    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  }
}

但是可能存在架构错误。 如果你的方法失败并且你需要抛出异常,你不应该期望它返回任何东西。 也许你对这个方法承担了太多的责任,应该创建一个只对模型数据进行建模的分离,并在出现问题时抛出异常,回滚事务。 无论如何,阅读文档。

使用TransactionAspectSupport.currentTransactionStatus()ect事务管理器为您的bean获取TransactionStatus尝试在事务管理器中调用Rollback(DefaultTransactionStatus状态)。

参考弹簧文档

强烈建议您尽可能使用声明性方法进行回滚。 如果您绝对需要程序化回滚,则可以使用程序化回滚,但它的使用方式可以实现基于POJO的简洁体系结构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM