关于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实现事务管理的原理
随机推荐
- 去掉WARN spring.jpa.open-in-view is enabled by default
使用springboot jpa,在运行项目时发现一个WARN WARN 11472 --- [ main] aWebConfiguration$JpaWebMvcConfiguration : sp ...
- spring boot2.x中集成H2数据库
H2数据库介绍 查看 在spring boot中集成 1.添加依赖 <dependency> <groupId>org.springframework.boot</gr ...
- 小甲鱼汇编语言学习笔记——day03
手动编译并执行第一个汇编程序过程: 1.用notepad++写一个简单的汇编程序(文件命名为:1.asm): assume cs:abc abc segment mov ax, 2 add ax, a ...
- vs code 自定义配置记录
java环境安装:https://devblogs.microsoft.com/visualstudio/announcing-visual-studio-code-java-installer/ 保 ...
- 01-Windows Server 2012的配置与部署
一. 背景 这里以阿里云Windows Server 2012系统的服务器为主,介绍服务器的配置以及.Net程序的发布顺序,在后续的项目管理文章中,会介绍<运维手册>的写法. 二. 步骤 ...
- 【Uiautomatorviewer】报错:Unexpected error while obtaining UI hierarchy java.lang.reflect.InvocationT...
android 9.0系统不能用uiautomator识别 解决方法:android 8.0 以后 uiautomator 无法直接使用的问题https://www.cnblogs.com/copyw ...
- js中常见的创建对象的方法(1)
工厂模式:抽象了创建具体对象的过程 function createPerson(name, age, job){ var obj = new Object(); obj.name = name; ob ...
- t100 debug常用指令
1. r.d 程式代號 Find (Ctrl+F) => Find Next(F3). 設中斷點(Toggle):Double Click => Run/Continue the ...
- Hive 系列(三)—— Hive CLI 和 Beeline 命令行的基本使用
一.Hive CLI 1.1 Help 使用 hive -H 或者 hive --help 命令可以查看所有命令的帮助,显示如下: usage: hive -d,--define <key=va ...
- ELK学习笔记之使用curl命令操作elasticsearch
0x00 _cat系列 _cat系列提供了一系列查询elasticsearch集群状态的接口.你可以通过执行curl -XGET localhost:9200/_cat 1. 获取所有_cat系列的操 ...