首先我们看下执行service执行delete(方法上面有@Transaction注解)操作调用栈
delete:MyTestServiceImpl
invoke0:NativeMethodAccessorImpl
invoke:NativeMethodAccessorImpl
invoke:Method
invokeJoinpointUsingReflection:AopUtils
invokeJoinpoint:ReflectiveMethodInvocation
proceed:ReflectiveMethodInvocation
proceedWithInvocation:TransactionInterceptor
invokeWithTransaction:TransactionAspectSupport
invoke:TransactionInterceptor
proceed:ReflectiveMethodInvocation
invoke:JdkDynamicAopProxy
delete:$Proxy81
上面调用顺序是从下往上执行。有上面分析可知,显示代理service执行然后经过一系列的事务类最终进入真正的Service方法上面
执行TransactionInterceptor中可以十分清楚看到事务的处理
protected Object invokeWithinTransaction(Method method, Class<?> targetClass, final TransactionAspectSupport.InvocationCallback invocation) throws Throwable {
final TransactionAttribute txAttr = getTransactionAttributeSource().getTransactionAttribute(method, targetClass);
final PlatformTransactionManager tm = determineTransactionManager(txAttr);
final String joinpointIdentification = methodIdentification(method, targetClass);
if (txAttr != null && tm instanceof CallbackPreferringPlatformTransactionManager) {
try {
Object result = ((CallbackPreferringPlatformTransactionManager)tm).execute(txAttr, new TransactionCallback<Object>() {
public Object doInTransaction(TransactionStatus status) {
TransactionAspectSupport.TransactionInfo txInfo = TransactionAspectSupport.this.prepareTransactionInfo(tm, txAttr, joinpointIdentification, status);
TransactionAspectSupport.ThrowableHolder var4;
try {
Object var3 = invocation.proceedWithInvocation();
return var3;
} catch (Throwable var8) {
if (txAttr.rollbackOn(var8)) {
if (var8 instanceof RuntimeException) {
throw (RuntimeException)var8;
}
throw new TransactionAspectSupport.ThrowableHolderException(var8);
}
var4 = new TransactionAspectSupport.ThrowableHolder(var8);
} finally {
TransactionAspectSupport.this.cleanupTransactionInfo(txInfo);
}
return var4;
}
});
if (result instanceof TransactionAspectSupport.ThrowableHolder) {
throw ((TransactionAspectSupport.ThrowableHolder)result).getThrowable();
} else {
return result;
}
} catch (TransactionAspectSupport.ThrowableHolderException var14) {
throw var14.getCause();
}
} else {
//通过方法名称可以得知这里是如果需要事务控制创建事务
TransactionAspectSupport.TransactionInfo txInfo = this.createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
Object retVal = null;
try {
retVal = invocation.proceedWithInvocation();
} catch (Throwable var15) {
//如果有事务则回滚事务
this.completeTransactionAfterThrowing(txInfo, var15);
throw var15;
} finally {
//释放事务资源
this.cleanupTransactionInfo(txInfo);
}
//如果存在事务提交事务
this.commitTransactionAfterReturning(txInfo);
return retVal;
}
}
上面几个方法讲解
final TransactionAttribute txAttr = this.getTransactionAttributeSource().getTransactionAttribute(method, targetClass);
上面method就是真正执行的Service调用的方法,targetClass就是真正执行的Service的Class
这个方法用来获取service方法上面的Transaction注解上面的propagation和isolation注解
final String joinpointIdentification = this.methodIdentification(method, targetClass);
这个上面参数和上一方法的参数一模一样这个方法用当前将要执行service的完整方法名称
我接着往下看会看到
TransactionAspectSupport.TransactionInfo txInfo = this.createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
这个方法从名字上就能看出事务开始创建方法
protected TransactionAspectSupport.TransactionInfo createTransactionIfNecessary(PlatformTransactionManager tm, TransactionAttribute txAttr, final String joinpointIdentification) {
if (txAttr != null && ((TransactionAttribute)txAttr).getName() == null) {
txAttr = new DelegatingTransactionAttribute((TransactionAttribute)txAttr) {
public String getName() {
return joinpointIdentification;
}
};
}
TransactionStatus status = null;
if (txAttr != null) {
if (tm != null) {
status = tm.getTransaction((TransactionDefinition)txAttr);
}
}
return this.prepareTransactionInfo(tm, (TransactionAttribute)txAttr, joinpointIdentification, status);
}
//预准备事务
protected TransactionAspectSupport.TransactionInfo prepareTransactionInfo(PlatformTransactionManager tm, TransactionAttribute txAttr, String joinpointIdentification, TransactionStatus status) {
TransactionAspectSupport.TransactionInfo txInfo = new TransactionAspectSupport.TransactionInfo(tm, txAttr, joinpointIdentification);
if (txAttr != null) {
txInfo.newTransactionStatus(status);
}
txInfo.bindToThread();
return txInfo;
}
//将事务和线程绑定到一起
private void bindToThread() {
this.oldTransactionInfo = (TransactionAspectSupport.TransactionInfo)TransactionAspectSupport.transactionInfoHolder.get();
TransactionAspectSupport.transactionInfoHolder.set(this);
}
最后我们可以发现其上面的ThreadLocal用来存放控制事务变量
private static ThreadLocal<TransactionAspectSupport.TransactionInfo> transactionInfoHolder = new NameThreadLocal();
如果我么调用的Service方法上面没有@Transaction注解时其调用栈不会是上面,如下
listAll:MyTestServiceImpl
invoke0:NativeMethodAccessorImpl
invoke:NativeMethodAccessorImpl
invoke:DelegatingMethodAccessorImpl
invokeJoinpointUsingReflection:AopUtils
invoke:JdkDynamicAopProxy
listAll:$Proxy
我们源码进行跟踪查看是在下面如果没有@Transaction注解此处为0
List<Object> chain = advised.getInterceptorsAndDynamicInterceptionAdvice(method,targetClass);
if(chain.isEmpty()){
if(chain.isEmpty()){
Object[] argsToUse = AopProxyUtils.adaptArgumentsIfNecessary(method,args);
retVal = AopUtils.invokeJoinpintUsingReflection(target,method,argsTouse);}else{
invocation = new ReflectiveMethodInvocation(proxy,target,method,args,targetClass,chain);
retVal = invoaction.proceed();
}