关于srping的AOP事务管理问题,自定义切面是否导致事务控制失效
applicationContext.xml:
<!-- 方法调用时间记录 -->
<bean id="methodExecuteTime" class="com.common.aspect.Aspect" /> <!-- Spring AOP config (* com.customer.service.*.*(..))中几个通配符的含义: 第一个 * :通配
任意返回值类型 第二个 * :通配 包com.customer.service下的任意class 第三个 * :通配 包com.customer.service下的任意class的任意方法
第四个 .. :通配 方法可以有0个或多个参数 -->
<aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="true"/>
<aop:config proxy-target-class="true">
<aop:pointcut id="serviceMethods" expression="execution(* com.customer.service..*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" order="2" /> <!--此处配置使得事务控制 回滚失效 暂时注释掉-->
<!-- DB Service log -->
<aop:aspect id="logThrsysServiceMethodExecuteTime" ref="methodExecuteTime" >
<aop:pointcut id="thrsysServiceMethods" expression="execution(* com.customer.service..*.*(..))" />
<aop:around method="methodExecuteTime" pointcut-ref="thrsysServiceMethods" />
</aop:aspect>
</aop:config>
当时在一个update开头的方法中有多个更新数据库的操作,为了测试事务回滚的有效性,在代码中放置了一段空指针异常代码,发现事务并没有回滚。
注释掉<!--此处配置使得事务控制 回滚失效 暂时注释掉-->下的内容,事务正常回滚。当时记得重复验证了要几次,事务并没有因为异常而回滚,所以才注释掉了下面的切面。
但是后来不知道什么原因,放开这个注释事务也能正常回滚了。没有找到什么原因导致这样。(不知道是我当时测的时候的问题,还是后来因为改了什么东西的原因导致的,特意在此记录)。
package com.common.aspect; import com.common.util.SensitiveParamUtils;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.reflect.MethodSignature; import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date; @Slf4j
public class Aspect { private final static SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public Object methodExecuteTime (ProceedingJoinPoint joinPoint) throws Throwable {
Object object;
Date startDate = new Date();
Signature signature = joinPoint.getSignature();
MethodSignature ms = (MethodSignature)signature;
Method method = ms.getMethod();
Class<?>[] paramTypes = method.getParameterTypes();
Object[] args = joinPoint.getArgs();
//访问目标方法的参数:
log.info("{} 调用时间:{}",signature.toString(), sdf.format(startDate));
long start = System.currentTimeMillis();
object = joinPoint.proceed();
long end = System.currentTimeMillis();
String time = formatExecuteTime(end - start);
log.info("{} 执行时间:{}",signature.toString(), time);
new Thread(() -> {
for (int i = 0; i < paramTypes.length; i++) {
args[i] = SensitiveParamUtils.getJson(args[i]);
}
log.info("{} 方法入参{}", signature.toString(), Arrays.toString(args));
}).start(); return object;
} private String formatExecuteTime(long executeTime) {
long min = (executeTime % 3600000) / 60000;
long sec = (executeTime % 60000) / 1000;
long msec = executeTime % 10000;
StringBuilder sb = new StringBuilder();
if (min > 0) {
sb.append(min).append("m ");
}
if (sec > 0) {
sb.append(sec).append("s ");
}
sb.append(msec).append("ms");
return sb.toString();
}
}
单元测试、service自定义写,在service中加入空指针异常代码检测事务回滚的有效性。
关于srping的AOP事务管理问题,自定义切面是否导致事务控制失效的更多相关文章
- Spring事务管理实现方式之编程式事务与声明式事务详解(转)
原文:https://blog.csdn.net/liaohaojian/article/details/70139151 编程式事务 编码方式实现事务管理(代码演示为JDBC事务管理) Spring ...
- Spring事务管理详解_基本原理_事务管理方式
1. 事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,使用JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交,那在没有Spring帮我们管理事 ...
- Spring AOP事务管理(使用切面把事务管理起来)
在<Spring Transaction 分析事务属性(事务的基本概念.配置)>基础上 http://blog.csdn.net/partner4java/article/details/ ...
- Spring事务管理----声明式:利用TransactionProxyFactoryBean生成事务代理
通常建议采用声明式事务管理.声明式事务管理的优势非常明显:代码中无需关于关注事务逻辑,让spring声明式事务管理负责事务逻辑,声明式事务管理无需与具体的事务逻辑耦合,可以方便地在不同事务逻辑之间切换 ...
- Spring事务管理之几种方式实现事务
1.事务认识 大家所了解的事务Transaction,它是一些列严密操作动作,要么都操作完成,要么都回滚撤销.Spring事务管理基于底层数据库本身的事务处理机制.数据库事务的基础,是掌握Spring ...
- 9.spring:事务管理(下):声明式事务管理
声明式事务管理 sprin的声明式事务是管理AOP技术实现的事务管理,其本质是是对方法前后进行拦截,然后 在目标方法开始之前创建或者加入一个事务,在执行完成目标方法之后根据执行情况提交或者回滚事务. ...
- Spring事务管理之几种方式实现事务(转)
一:事务认识 大家所了解的事务Transaction,它是一些列严密操作动作,要么都操作完成,要么都回滚撤销.Spring事务管理基于底层数据库本身的事务处理机制.数据库事务的基础,是掌握Spring ...
- [转]Spring的事务管理难点剖析(1):DAO和事务管理的牵绊
原文地址:http://stamen.iteye.com/blog/1441758 有些人很少使用Spring而不使用Spring事务管理器的应用,因此常常有人会问:是否用了Spring,就一定要用S ...
- 手写事务管理器 也是spring实现事务管理的原理
随机推荐
- WIN10设置notepad++默认打开txt文件
修改txt的默认打开方式为notepad++.效果如下图所示 修改方式: 1.新建名称为OpenFromNotepad++的txt文档,并将后缀名修改为reg格式(注册表格式),在文件中输入以下内容. ...
- 关于jQuery请求后台成功一直走error回调函数问题
如果dataType声明与响应不符就会进入error回调.就算接口请求成功,也是走error回调函数.
- 【记录】【java】反射设值取值
1.设值 /** * 根据属性名设置属性值 * * @param fieldName * @param object * @return */ public boolean setFieldValue ...
- SQL Server表水平分区
随着项目的运行时间越来越久,数据库的数据会越来越多,某些表因为数据量的变大查询起来会很慢,而且拥有大量数据的表整张表的数据都存于一个mdf文件中,不利于数据文件的维护和管理,我们一般都会通过优化sql ...
- php开发工程师都需要掌握什么技能呢?
PHP原生标准库精通,三种大型框架中熟练掌握一门的开发(Symfony2.Yii.ZF2),小型框架中(Codeigniter 等)通读其一源码. MySQL语句精通,实践构造 1000 万级的数据库 ...
- day21——面向对象初识、结构、从类名研究类、从对象研究类、logging模块进阶版
day21 面向对象的初识 面向对象第一个优点: 对相似功能的函数,同一个业务下的函数进行归类,分类. 想要学习面向对象必须站在一个上帝的角度去分析考虑问题. 类: 具有相同属性和功能的一类事物. 对 ...
- SQLite接口函数 - C核心api实践与总结
SQLite核心源代码由C语言写就,同时提供了很多的扩展包可应用于其他编程语言和类库,如Python.Ruby.Java.Perl..Net/C#.Qt和ODBC.在很多情况下,针对一种语言有很多扩展 ...
- SpringBootServletInitializer报错
1. 现象 从Springboot 1.5.1.RELEASE 升级到Springboot 2.1.2.RELEASE 后SpringBootServletInitializer报错. 2.解决方法 ...
- 过滤器 & 监听器 & 拦截器
过滤器: https://blog.csdn.net/MissEel/article/details/79351231 https://blog.csdn.net/qq_32363305/articl ...
- Java自学-数组 二维数组
Java 如何使用二维数组 这是一个一维数组, 里面的每一个元素,都是一个基本类型int int a[] =new int[]{1,2,3,4,5}; 这是一个二维数组,里面的每一个元素,都是一个一维 ...