文档章节

Spring中事务与aop的先后顺序问题

翊骷
 翊骷
发布于 2014/08/19 10:36
字数 285
阅读 13399
收藏 9

       Spring中的事务是通过aop来实现的,当我们自己写aop拦截的时候,会遇到跟spring的事务aop执行的先后顺序问题,比如说动态切换数据源的问题,如果事务在前,数据源切换在后,会导致数据源切换失效,所以就用到了Order(排序)这个关键字.

        我们可以通过在@AspectJ的方法中实现org.springframework.core.Ordered 这个接口来定义order的顺序,order 的值越小,说明越先被执行。比如代码如下:

/**
 * @author HuifengWang
 * aop面向切面编程
 *
 */
@Component
@Aspect
public class AspectJ4DataBase implements Ordered{
	
	//拦截所有的service操作
	@Pointcut("execution( * com.hc.shop.*.service.*.*(..))")
	public void readMethod() {
	}// 匹配所有的读取操作
	
	@Before("readMethod()")
	public void onlyReadPre(){
		DataSourceContextHolder.setDataSourceType(DataSourceType.MYSQL);
		System.out.println("数据库切换MYSQL");
	}
	@After("readMethod()")
	public void onlyReadPast(){
		DataSourceContextHolder.setDataSourceType(DataSourceType.ORACLE);
		System.out.println("数据库切换回ORACLE");
	}

	@Override
	public int getOrder() {
		// TODO Auto-generated method stub
		return 1;
	}
}

    在事务配置的地方也配置order 字段,代码如下:

    

<!-- 注解方式配置事物 -->
<tx:annotation-driven transaction-manager="transactionManager" order="2"/>

这样就实现了我们自己写的aop在事务介入之前就执行了!



© 著作权归作者所有

翊骷
粉丝 14
博文 125
码字总数 68191
作品 0
济南
程序员
私信 提问
加载中

评论(9)

扫地的小熊
应该在指定spring声明式事务order的同时,指定其代理方式为ASPECTJ,默认为proxy。
springboot下:@EnableTransactionManagement(order = 2, mode= AdviceMode.ASPECTJ)
扫地的小熊
试了没作用。spring和Aspect用到代理方式是不一样的。order貌似只对相同的代理方式生效
驯服恒星
驯服恒星
经测试,楼主方法有效。@Order注解与实现@Ordered接口原理一样,效果一样
黄六六
黄六六
这样事务会失效吗?
一曲相思
纠结我几个小时的问题解决了
zzuqiang
zzuqiang
必须管用的。哈哈
HL_L
HL_L
79
WeiXiaodong
WeiXiaodong
真管用 holy high
xianwu13
xianwu13
管用吗?
Spring AOP 日志拦截器的事务管理

如果要在方法执行前或后或抛出异常后加上一个自己的拦截器,或者一个环绕拦截器,在拦截器中执行一些操作,比如执行一些数据库操作,记录一些信 息,这些操作通过调用一个服务类的方法来执行...

哲别0
2018/05/18
467
0
Spring aop事务先后问题

Spring中的事务是通过aop来实现的,当我们自己写aop拦截的时候,会遇到跟spring的事务aop执行的先后顺序问题,比如说动态切换数据源的问题,如果事务在前,数据源切换在后,会导致数据源切换...

毅屺
2016/04/05
478
2
【每日提高之声明式事物】spring声明式事务 同一类内方法调用事务失效

【问题】 Spring的声明式事务,我想就不用多介绍了吧,一句话“自从用了Spring AOP啊,事务管理真轻松啊,真轻松;事务管理代码没有了,脑不酸了,手不痛了,一口气全配上了事务;轻量级,测...

卯金刀GG
2018/08/01
75
0
hibernate persist update 方法没有正常工作(不保存数据,不更新数据)

工程结构 问题描述 在工程中通过spring aop的方式配置事务,使用hibernate做持久化。在代码实现中使用hibernate persit()方法插入数据到数据库,使用hibernate update()方法更新数据。问题是...

xiaoheike
2016/04/15
0
0
Spring之旅第五篇-AOP详解

一、什么是AOP? Aspect oritention programming(面向切面编程),AOP是一种思想,高度概括的话是“横向重复,纵向抽取”,如何理解呢?举个例子:访问页面时需要权限认证,如果每个页面都去实...

花漾年华
05/08
9
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx访问日志/日志切割/静态文件过期时间/防盗链

Nginx访问日志主要记录部署在nginx上的网站访问数据,日志格式定义在nginx主配置文件中。 nginx主配置文件:/etc/nginx/nginx.conf 查看nginx主配置文件: ```markup [root@linux ~]# cat /e...

asnfuy
2分钟前
0
0
JS_高程4.变量,作用域和内存问题(2)执行环境及作用域

本文转载于:专业的前端网站➨JS_高程4.变量,作用域和内存问题(2)执行环境及作用域 1.执行环境:执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为,       每个执...

前端老手
6分钟前
2
0
手机迅雷下载的文件,电脑上找不到问题

不知道手机迅雷怎么做到的,手机迅雷下载的文件,手机上可以看的到 但连电脑后, 电脑上看不到文件 . 尝试了打开查看隐藏文件, 但没有效果 . 手机上查询文件权限 也是对的 . 可读,可写, 不隐藏 ...

ol_O_O_lo
7分钟前
2
0
python学习11:Python tuple元组详解

元组是 Python 中另一个重要的序列结构,和列表类似,也是由一系列按特定顺序排序的元素组成。和列表不同的是,列表可以任意操作元素,是可变序列;而元组是不可变序列,即元组中的元素不可以...

太空堡垒185
19分钟前
3
0
Java实现数据结构之线性结构

一、顺序表 顺序表本质是使用数组储存数组的一种数据结构,在计算机的储存中是连续的分配内存的。 下面是我自己使用java实现的简单顺序表结构 package list; public class MyArrayList<E> { ...

daxiongdi
22分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部