继续分析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)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。