【问题标题】:Rolling back transaction with aspect in Spring boot application在 Spring Boot 应用程序中使用切面回滚事务
【发布时间】:2021-07-24 20:52:44
【问题描述】:

我不熟悉面向方面编程的概念。我正在我的 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 {
 ..
}

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

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

【问题讨论】:

    标签: java spring-boot aop aspectj spring-transactions


    【解决方案1】:

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

    摘录:

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

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

    还通过在事务代理上调用方法的概念视图:

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

    【讨论】:

      【解决方案2】:

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

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

      我认为您需要检查方面的顺序以找到最适合您需求的模式。

      【讨论】:

        猜你喜欢
        • 2018-11-05
        • 2020-03-11
        • 2020-02-06
        • 1970-01-01
        • 2018-09-03
        • 1970-01-01
        • 2020-07-07
        • 2022-01-27
        • 1970-01-01
        相关资源
        最近更新 更多