A-A+

AOP的事务包裹

2018年08月30日 技术 暂无评论 阅读 2,513 次

我们有时候会希望这样:

  1. @拦截的注解
  2. private void 我是被拦截的函数() {
  3.         ... ....
  4. }
  1. //环绕通知
  2. @Around("...")
  3. public void roundRun(ProceedingJoinPoint joinPoint) {
  4.     try {
  5.         //执行被拦截的函数
  6.         joinPoint.proceed();
  7.         //做一些记录或者业务逻辑判断
  8.         ... ...
  9.     } catch (Throwable e) {
  10.         throw new RuntimeException(e);
  11.     }
  12. }

在“做一些记录或者业务逻辑判断”发生异常时,有时候我们希望之前被拦截的函数也能够进行事务回滚,但是最终再测试的时候却发现并没有按照我们预想的那样进行回滚,这时候我们需要这样做:

1. 设置事务的拦截排序号为n。

  1. <!-- 配置事务管理 -->
  2. <tx:annotation-driven transaction-manager="txManager"
  3.                                       proxy-target-class="true" order="n"/>

2. 设置自定义的拦截排序号为n+1。

  1. /**
  2.  * 测试用AOP拦截,被事务包裹
  3.  */
  4. @Aspect
  5. @Order(n+1)
  6. @Component
  7. public class 我是AOP实现类 {
  8.         ... ...
  9. }

之所以这样做,是因为:

1. 如果事务拦截的排序号低。

  1. 事务开启...
  2. try {
  3.         AOP实现...
  4.         被拦截函数...
  5. catch {
  6. }
  7. 事务提交或者回滚...

2. 如果事务拦截的排序号高。

  1. AOP实现...
  2. try {
  3.         事务开启...
  4.         被拦截的函数...
  5.         事务提交...
  6. catch {
  7.         事务回滚...
  8. }

给我留言

Copyright © 字痕随行 保留所有权利.   Theme  Ality

用户登录

分享到: