通过idea断点分析service执行流程

首先我们看下执行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()){
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();

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值