如何解决在 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 以更好地理解概念并控制建议的顺序。
基本上这个想法是从自定义方面抛出异常,该异常应该导致从 Transaction Advisor
回滚。
简短的回答是视情况而定。方面在 Spring 中是有序的,这意味着它们以特定的顺序运行。这意味着,如果您的切面设置为在 transactional
切面之前运行,则不会创建任何事务,也不会实际回滚任何内容。
另一方面,如果您将其设置为在事务方面之后运行并且它确实抛出了异常,则这将自动意味着该事务将已运行并将被提交。
我相信您需要检查方面的排序以找到最适合您需求的模式。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。