继续分析Spring框架事务中,事务管理器的AbstractPlantformTransactionManager的getTransaction方法的剩余部分。

前面我们已经对存在已开启事务的情况下的代码逻辑完成了分析。

getTransaction

下面的逻辑,就是不存在已开启事务的代码逻辑了。

由于我们已经多startTransacton方法做过详细分析,所以,剩余的部分非常简单了。无非就是需要的时候调用startTransaction开启事务,不需要的时候要么抛异常、要目不开启事务。

如果事务传播机制设置为MANDATORY的话抛异常(MANDATORY要求必须存在已开启事务)。

if (def.getTimeout() < TransactionDefinition.TIMEOUT_DEFAULT) {
            throw new InvalidTimeoutException("Invalid transaction timeout", def.getTimeout());
        }
if (def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_MANDATORY) {
            throw new IllegalTransactionStateException(
                    "No existing transaction found for transaction marked with propagation 'mandatory'");
        }

接下来,如果事务传播机制为REQUIRED、REQUIRES_NEW或者PROPAGATION_NESTED的话,设置挂起事务为null(因为当前不存在已开启的事务),调用startTransaction启用一个新事务并返回。startTransaction我们在上一篇文章已经详细分析过了。

else if (def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRED ||
                def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW ||
                def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED) {
            SuspendedResourcesHolder suspendedResources = suspend(null);
            if (debugEnabled) {
                logger.debug("Creating new transaction with name [" + def.getName() + "]: " + def);
            }
            try {
                return startTransaction(def, transaction, debugEnabled, suspendedResources);
            }
            catch (RuntimeException | Error ex) {
                resume(null, suspendedResources);
                throw ex;
            }
        }

否则,除以上事务传播机制外,其他的传播机制、当前不存在事务的情况下就不再需要创建事务了:

else {
            // Create "empty" transaction: no actual transaction, but potentially synchronization.
            if (def.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT && logger.isWarnEnabled()) {
                logger.warn("Custom isolation level specified but no actual transaction initiated; " +
                        "isolation level will effectively be ignored: " + def);
            }
            boolean newSynchronization = (getTransactionSynchronization() == SYNCHRONIZATION_ALWAYS);
            return prepareTransactionStatus(def, null, true, newSynchronization, debugEnabled, null);
        }

终于,到这里,Spring事务管理器三大方法之一的getTransaction方法分析完毕!!!

喘口气,后面继续分析剩余的两大方法:commit和rollback。

下一篇: Spring事务框架之TransactionManager(4)
上一篇: Spring事务框架之TransactionManager(2)


45 声望17 粉丝