AOP 事务
定义
AOP实际可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术,非业务类横切于业务类),
通过AOP以动态和非入侵方式来增强服务
事务的四大属性:ACID即事务的原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability.。
结构
切面类也就是advisor通知器=advise通知(增强)+pointcut
SpringAOP起作用流程
Factory中getObject中初始化设置advisor等,通过有无接口选择JDK自带的方式或者Cglib方式获得代理对象,JDK自带的方式或者Cglib方式中invoke执行,
getInterceptorsAndDynamicInterceptionAdvice获取拦截器完成横切面织入,然后执行proceed,此为递归方法
使用AOP
新建 接口A,实现接口A的类B,包含Proxy回调方法并且实现InvocationHandler的类C,调用 Proxy.newProxyInstance(A.getClass().getClassLoader(),
new Class[]{A.class}, new C()); 调用参数 类装载器,代理接口,Proxy回调方法所在的对象(该对象实现InvocationHandler)
事务AOP 类比
1 ProxyFactoryBean即Proxy,TransactionInterceptor即C,ProxyFactoryBean设置targe、interceptorNames,ProxyFactoryBean 用来配置目标对象和切面行为,
以getObject方法作为入口
2 TransactionProxyFactoryBean替代了ProxyFactoryBean和TransactionInterceptor,并设置target、transactionManager、transactionAttributes
注解方式使用AOP
AOP加上
<aop:aspectj-autoproxy />
事务AOP加上
<tx:annotation-driven transaction-manager="transactionManager"/>
两种动态代理方式
区别
JDK 给我们提供的动态代理不能代理没有接口的类,我们使用开源的 CGLib 类库可以代理没有接口的类
共性
两者对拦截器的处理调用都是在ReflectiveMethodInvocation中通过proceed方法实现
JDK 代理方式
JDK的AopProxy代理对象,使用的是invocationHandler的invoke回调入口,构造ReflectiveMethodInvocation对象完成拦截器链的调用,
Proxy.newProxyInstance 生成代理对象是指定三个参数,类装载器,代理接口,Proxy回调方法所在的对象(该对象实现InvocationHandler)
CGLIB 代理方式
CGLIB的AopProxy代理对象,使用的是DynamicAdvisedInterceptor的interceptor来完成回调,构造CglibMethodInvocation对象完成拦截器链的调用
事务隔离级别分四种
ISOLATION_READ_COMMITTED ISOLATION_READ_UNCOMMITTED
ISOLATION_REPEATABLE_READ ISOLATION_SERIALIZABLE
事务传播 七种
PROPAGATION_REQUIRED
PROPAGATION_REQUIRES_NEW
PROPAGATION_SUPPORTS
PROPAGATION_NOT_SUPPORTED(如果当前存在事务,则把当前事务挂起)
PROPAGATION_NEVER(如果当前存在事务,则抛出异常)
PROPAGATION_MANDATORY
如果当前没有事务,则抛出异常 如果当前存在事务,则加入该事务
PROPAGATION_NESTED
如果当前存在事务当前事务的嵌套事务 如果当前没有事务,则等PROPAGATION_REQUIRED
内嵌事务并不是一个独立的事务,它依赖于外部事务的存在,只有通过外部的事务提交,才能引起内部事务的提交,嵌套的子事务不能单独提交
@Transactional中一般会设置事务传播和timeout
注意点
1在接口上使用 @Transactional 注解,但是这将只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承 的
2 Transactional 的事务开启 ,或者是基于接口的 或者是基于类的代理被创建,
所以在同一个类中一个没有事务的方法调用另一个方法有事务的方法,事务是不会起作用
在同一个类中一个有事务的方法调用另一个方法有事务的方法,在同一个事务中运行,
在两个类中一个有事务的方法调用另外一个类的没有事务的方法,在同一个事务中运行
在两个类中一个有事务的方法调用另外一个类的有New事务的方法,在新事务中运行
3事务执行实现中,transactionInfo和transactionStatus对象贯穿,二者通过对线程绑定实现事务的隔离,记录事务执行情况,具体的事务操作提交给具体的事务处理器操作
TransactionProxyFactoryBean中实例化TransactionInterceptor,TransactionInterceptor中的入口invoke的createTransactionIfNecessary获取transactionInfo,
createTransactionIfNecessary在TransactionInterceptor基类TransactionAspectSupport中实现,
createTransactionIfNecessary中getTransaction获取transactionStatus,在事务处理器超类AbstractPlatformTransactionManager中实现,
体的事务操作提交给具体的事务处理器操作
AOP 事务的更多相关文章
- C#.NET利用ContextBoundObject和Attribute实现AOP技术--AOP事务实现例子
我前两天看见同事用写了用AOP技术实现缓存的方案,于是好奇看了一下这是怎么实现的.原来是用了.NET中的一个类ContextBoundObject和Attribute相关技术.其实个类在.NET Fr ...
- JAVAEE——spring03:spring整合JDBC和aop事务
一.spring整合JDBC 1.spring提供了很多模板整合Dao技术 2.spring中提供了一个可以操作数据库的对象.对象封装了jdbc技术. JDBCTemplate => JDBC模 ...
- 2019.1.6 2.8 Spring的AOP事务
2.8 Spring的AOP事务 xml配置aop事务 先applicationContext.xml 文件 配置事务管管理器 配置通知 织入目标对象
- Spring AOP事务管理(使用切面把事务管理起来)
在<Spring Transaction 分析事务属性(事务的基本概念.配置)>基础上 http://blog.csdn.net/partner4java/article/details/ ...
- JavaWeb_(Spring框架)Spring中的aop事务
1.事务相关知识 a)什么是事务:把多条数据库操作捆绑到一起执行,要么都成功,要么都失败: b)事务的原则ACID: i.原子性:事务包含的所有操作,要么全部成功,要么全部失败回滚,成功全部应用到数据 ...
- .NetCore学习笔记:三、基于AspectCore的AOP事务管理
AOP(面向切面编程),通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑 ...
- 掌握基于AOP事务管理
一.手动管理和半自动工厂模式 二.AOP事务管理 1.表达式中,第一个※是返回值所有类型,service包下一个点意思是service包下的类,两个点意思是service包下的类和其子包下的类也包含, ...
- 抛出自定义异常,spring AOP事务不回滚的解决方案
spring AOP 默认对RuntimeException()异常或是其子类进行事务回滚,也就是说 事务回滚:throw new RuntimeException("xxxxxxxxxxx ...
- [AOP系列]Autofac+Castle实现AOP事务
一.前言 最近公司新项目,需要搭架构进行开发,其中需要保证事务的一致性,经过一番查找,发现很多博文都是通过Spring.Net.Unity.PostSharp.Castle Windsor这些方式实现 ...
随机推荐
- 双系统下(Ubuntu + win7)windows 无法连接无线网络
双系统下(Ubuntu + win7)windows 无法连接无线网络 今天开机登录win7,突然发现无法使用无线网络(WiFi信号标志有个大红叉),于是查看设备驱动,一切正常,这就奇怪了:用Wind ...
- Masonry控制台打印约束冲突问题解决
不知道你是不是视图的布局也是用的第三方Masonry,在使用中是不是也遇到了控制台约束冲突的警告打印,看下图: 从输出的信息可以知道,有的控件的约束明显重复了设置,所以指出了是哪个控件,重复设置了哪些 ...
- (引用)Python 生成随机数小结
转载:http://blog.csdn.net/shuaijiasanshao/article/details/51339438
- C/C++入门---运算符
1, 运算符的优先级 C语言的运算符共有15个优先级,各运算符及其优先级和结合律如下: 运算符 结合律 ()[]-> 从左到右 !~++ -- +(正号) -(负号) *(指针取址符) (typ ...
- html只给自己
//另外一个 height:400px; weight:400px; border-top-left-radius: 10px; border-top-right-radius: 10px; bord ...
- Xamarin Mono 环境搭建(使用Visual Studio 2013 开发android 和 ios )
本文主要介绍Xamarin结合VS2013来开发Android应用程序,主要会介绍Mono和Xamarin的关系,以及整个搭建环境的过程. 一.Mono和Xamarin介绍 1.Mono简介 Mono ...
- 托管项目到github
将项目托管到github上面其实很简单,主要有以下几个步骤: 1.注册github账号 2.创建一个新的respository:命名这个respository(假设名字为Test),选择权限 3.创建 ...
- [Arduino] Arduino猪头笔记
1. 步进电机驱动 今天才发现....原来在不同的步进电机驱动模块里面,循环时钟是不一样的.... 步进电机驱动模块以及电路配置: 驱动代码的主要部分: int sp_param = 16383; d ...
- 简单一键CENTOS6 安装PPTP VPN方法记录
申明:我们使用PPTP VPN仅仅只能用在查阅资料等正规渠道,不要用在不良用途上.方法收集于网上,这里我用在搬瓦工VPS(VPS方案直达),采用的是CENTOS6 64位系统.我们需要预先将VPS服务 ...
- sql学习
1.改变表的某一字段的长度: alter table tt modify a char(2000); 2.不想打开表就查看某一字段的长度可用下面的方法: select length(a),leng ...