这篇博客是为了求解,为什么xml中配置通知顺序会影响结果,通知类型xml文档中明确标注了出来,为什么会出现最终通知比后置通知、异常通知提前执行的情况?希望有知道原因的大神可以解答!
目前尚未清楚原因
正常代码顺序:
<!-- 配置AOP -->
<aop:config>
<!-- 配置通用切入点 -->
<aop:pointcut id="pt1" expression="execution(* com.vector.service.impl.*.*(..))"/>
<!-- 配置切面 -->
<aop:aspect id="txAdvice" ref="tManager">
<!-- 配置前置通知,开启事务 -->
<aop:before method="beginTransaction" pointcut-ref="pt1"/>
<!-- 配置后置通知,提交事务 -->
<aop:after-returning method="commitTransaction" pointcut-ref="pt1"/>
<!-- 配置异常通知,回滚事务 -->
<aop:after-throwing method="rollbackTransaction" pointcut-ref="pt1"/>
<!-- 配置最终通知,释放连接 -->
<aop:after method="release" pointcut-ref="pt1"/>
</aop:aspect>
</aop:config>
执行结果(无异常)
开始事务
提交
关闭连接
执行结果(有异常)
开始事务
回滚
关闭连接
调整后代码顺序:
<!-- 配置AOP -->
<aop:config>
<!-- 配置通用切入点 -->
<aop:pointcut id="pt1" expression="execution(* com.vector.service.impl.*.*(..))"/>
<!-- 配置切面 -->
<aop:aspect id="txAdvice" ref="tManager">
<!-- 配置前置通知,开启事务 -->
<aop:before method="beginTransaction" pointcut-ref="pt1"/>
<!-- 配置最终通知,释放连接 -->
<aop:after method="release" pointcut-ref="pt1"/>
<!-- 配置后置通知,提交事务 -->
<aop:after-returning method="commitTransaction" pointcut-ref="pt1"/>
<!-- 配置异常通知,回滚事务 -->
<aop:after-throwing method="rollbackTransaction" pointcut-ref="pt1"/>
</aop:aspect>
</aop:config>
执行结果(无异常)
开始事务
关连接
执行回滚事务,但连接还回线程池,没有连接可以提交事务
执行结果(有异常)
开始事务
关连接
执行提交事务,但连接还回线程池,没有连接可以提交事务
调整后代码顺序:
- 前置-最终-异常-后置
<!-- 配置AOP -->
<aop:config>
<!-- 配置通用切入点 -->
<aop:pointcut id="pt1" expression="execution(* com.vector.service.impl.*.*(..))"/>
<!-- 配置切面 -->
<aop:aspect id="txAdvice" ref="tManager">
<!-- 配置前置通知,开启事务 -->
<aop:before method="beginTransaction" pointcut-ref="pt1"/>
<!-- 配置最终通知,释放连接 -->
<aop:after method="releaseTransaction" pointcut-ref="pt1"/>
<!-- 配置异常通知,回滚事务 -->
<aop:after-throwing method="rollbackTransaction" pointcut-ref="pt1"/>
<!-- 配置后置通知,提交事务 -->
<aop:after-returning method="commitTransaction" pointcut-ref="pt1"/>
</aop:aspect>
</aop:config>
执行结果(无异常)
开始事务
关连接
执行回滚事务,但连接还回线程池,没有连接可以提交事务
执行结果(有异常)
开始事务
关连接
执行提交事务,但连接还回线程池,没有连接可以提交事务
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。