美文网首页
Spring声明式事务

Spring声明式事务

作者: 田文健 | 来源:发表于2017-08-18 17:16 被阅读0次

    在org.springframework.transaction.interceptor包下面找到TransactionInterceptor类,这个类实现了Spring声明式事务的过程。找到它的invoke方法。

       @Override
        public Object invoke(final MethodInvocation invocation) throws Throwable {
            // Work out the target class: may be {@code null}.
            // The TransactionAttributeSource should be passed the target class
            // as well as the method, which may be from an interface.
            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方法:

    // If the transaction attribute is null, the method is non-transactional.
            final TransactionAttribute txAttr = getTransactionAttributeSource().getTransactionAttribute(method, targetClass);
            final PlatformTransactionManager tm = determineTransactionManager(txAttr);
            final String joinpointIdentification = methodIdentification(method, targetClass);
    

    这里获取了事务属性,事务管理器和切入点的标志符(一个字符串)。

    接下来是:

          if (txAttr == null || !(tm instanceof CallbackPreferringPlatformTransactionManager)) {
                // Standard transaction demarcation with getTransaction and commit/rollback calls.
                TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
                Object retVal = null;
                try {
                    // This is an around advice: Invoke the next interceptor in the chain.
                    // This will normally result in a target object being invoked.
                    retVal = invocation.proceedWithInvocation();
                }
                catch (Throwable ex) {
                    // target invocation exception
                    completeTransactionAfterThrowing(txInfo, ex);
                    throw ex;
                }
                finally {
                    cleanupTransactionInfo(txInfo);
                }
                commitTransactionAfterReturning(txInfo);
                return retVal;
            }
    

    当txAttr(事务属性)为空或者tm(事务管理器)为空时,是没有事务的,这一点在createTransactionIfNecessary中有更具体的实现。

    相关文章

      网友评论

          本文标题:Spring声明式事务

          本文链接:https://www.haomeiwen.com/subject/adyarxtx.html