事务(二)-----实现原理aop
程序员文章站
2022-05-09 15:59:33
...
Spring实现事务的方式分为编程式和声明式,其中声明式是最为常见的,声明式事务的实现又分为XML配置文件、@Transactional注解两种实现方式,SpringBoot因为取消了XML配置文件的书写,所以SpringBoot中的事务主要是使用@Transactional注解来实现的,下面从源码角度分析其原理
已知@Transactional事务实现的原理是基于AOP来实现的,在之前的博客中详细讲解了AOP的实现原理:动态代理+拦截链,由此可以大概推测出@Transactional的实现逻辑:Spring有一个针对@Transactional的增强器(拦截器)Interceptor,在bean实例初始化的最后一步会调用带该拦截器的拦截器链增强@Transactional注解的方法,并且生成代理类
TransactionInterceptor拦截器
关于拦截器链如何形成并且执行的,这里不做赘述,这里主要关注针对@Transactional注解的拦截器
TransactionInterceptor,和别的拦截器一样,他也有invoke方法
public class TransactionInterceptor extends TransactionAspectSupport implements MethodInterceptor, Serializable {
............
@Override
public Object invoke(final MethodInvocation invocation) throws Throwable {
Class<?> targetClass = (invocation.getThis() != null ? AopUtils.getTargetClass(invocation.getThis()) : null);
// Adapt to TransactionAspectSupport's invokeWithinTransaction...
return invokeWithinTransaction(invocation.getMethod(), targetClass, new InvocationCallback() {
@Override
public Object proceedWithInvocation() throws Throwable {
return invocation.proceed();
}
});
}
..........
}
跟一下invokeWithinTransaction 函数,省去不必要的代码,这里可以清晰的看到,该拦截器实现事务的方式和我们在DAO层手动实现事务差不多,都是先开启事务,再执行,如果异常则回滚,否则提交事务,只不过这里把执行的逻辑换成了递归执行拦截链了
protected Object invokeWithinTransaction(Method method, Class<?> targetClass, final InvocationCallback invocation)
throws Throwable {
.............
if (txAttr == null || !(tm instanceof CallbackPreferringPlatformTransactionManager)) {
// 开启事务
TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
Object retVal = null;
try {
//递归执行拦截链
retVal = invocation.proceedWithInvocation();
}
catch (Throwable ex) {
// 出现异常,回滚事务
completeTransactionAfterThrowing(txInfo, ex);
throw ex;
}
finally {
cleanupTransactionInfo(txInfo);
}
//提交事务
commitTransactionAfterReturning(txInfo);
return retVal;
}
.................
}
到这就可以清晰地了解,Spring的事务实现就是一个Spring自带的拦截器加入到拦截链中,该拦截器负责增强实现事务。
推荐阅读
-
用AOP实现业务service的重新调用(二) 博客分类: spring springaopinterceptorStaleConnectionExceptionSQL0901
-
数据结构学习2:查找算法之顺序查找和二分查找原理及Python实现
-
分页技术原理与实现之Java+Oracle代码实现分页(二)
-
分页技术原理与实现之Java+Oracle代码实现分页(二)
-
深入浅析Spring 的aop实现原理
-
深入浅析Spring 的aop实现原理
-
Spring 事务事件监控及实现原理解析
-
redux教程(二)redux的相关示例以及实现原理
-
redux教程(二)redux的相关示例以及实现原理
-
Spring中事务用法示例及实现原理详解