AOP 事务

Posted better technology ==more money

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 事务的主要内容,如果未能解决你的问题,请参考以下文章

Springday03 AOPSpring声明式事务Spring编程式事务

Aop事务小结(事务管理器和自身构建)

为啥在aop里面的事务不生效

spring事务管理aop

Spring AOP 事务配置(实现转账事务)

手写 Spring 事务IOCDI 和 MVC