微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Spring Boot 应用程序中使用方面回滚事务

如何解决在 Spring Boot 应用程序中使用方面回滚事务

我是面向切面编程概念的新手。我正在我的 Spring Boot 应用程序中使用 AspectJ 编写以下方面:

@Aspect
public class MyAspect {

  private final AspectUtil aspectUtil;

  public MyAspect(AspectUtil aspectUtil)) {
    this.aspectUtil = aspectUtil;
  }

  @pointcut("@within(org.springframework.stereotype.Service)")
  public void applicationservicepointcut() {
  }
  @AfterReturning(value = ("applicationservicepointcut()"))
  public void process(JoinPoint joinPoint) {
    HttpServletRequest request = aspectUtil.getRequest();
    aspectUtil.getHttpVerb(request);
    processUtil(request,joinPoint);
  }

  public void processUtil(HttpServletRequest request) {
    ...
}

我的应用程序中定义的所有服务都用 @Transactional 进行了注释,下面给出了一个示例:

@Service
@Transactional
public class MyService {
 ..
}

所以,这里我的问题是,如果我从上面定义的方面抛出任何异常,那么服务层中的关联事务会回滚吗?

其实我的目标是回滚整个事务,以防万一这方面发生任何异常。

解决方法

文档中提供了类似要求 1.4.8. Advising Transactional Operations 的示例。

摘录:

通知的排序是通过 Ordered 接口控制的。 ………… 前面配置的结果是一个 fooService bean 按该顺序应用了分析和事务方面。 如果您希望分析建议在事务建议之后运行 在出路的交易建议之前和之前,您 可以交换分析方面 bean 的 order 属性的值,以便 它高于交易建议的订单价值...

请务必通过:Advice Ordering 以更好地理解概念并控制建议的顺序。

还要看一下在事务代理上调用方法的概念视图: enter image description here

基本上这个想法是从自定义方面抛出异常,该异常应该导致从 Transaction Advisor 回滚。

,

简短的回答是视情况而定。方面在 Spring 中是有序的,这意味着它们以特定的顺序运行。这意味着,如果您的切面设置为在 transactional 切面之前运行,则不会创建任何事务,也不会实际回滚任何内容。

另一方面,如果您将其设置为在事务方面之后运行并且它确实抛出了异常,则这将自动意味着该事务将已运行并将被提交。

我相信您需要检查方面的排序以找到最适合您需求的模式。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。