Spring框架学习[Spring事务处理的实现](六)
; //将挂起的事务状态保存起来 DefaultTransactionStatus status = newTransactionStatus( definition, transaction, true, newSynchronization, debugEnabled, suspendedResources); //创建新事务 doBegin(transaction, definition); prepareSynchronization(status, definition); return status; } catch (RuntimeException beginEx) { resumeAfterBeginException(transaction, suspendedResources, beginEx); throw beginEx; } catch (Error beginErr) { resumeAfterBeginException(transaction, suspendedResources, beginErr); throw beginErr; } } //如果事务传播特性是nested嵌套事务 if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED) { //如果不允许事务嵌套,则抛出异常 if (!isNestedTransactionAllowed()) { throw new NestedTransactionNotSupportedException( "Transaction manager does not allow nested transactions by default - " + "specify 'nestedTransactionAllowed' property with value 'true'"); } if (debugEnabled) { logger.debug("Creating nested transaction with name [" + definition.getName() + "]"); } //如果允许使用savepoint保存点保存嵌套事务 if (useSavepointForNestedTransaction()) { //为当前事务创建一个保存点 DefaultTransactionStatus status = prepareTransactionStatus(definition, transaction, false, false, debugEnabled, null); status.createAndHoldSavepoint(); return status; } //如果不允许使用savepoint保存点保存嵌套事务 else { //使用JTA的嵌套commit/rollback调用 boolean newSynchronization = (getTransactionSynchronization() != SYNCHRONIZATION_NEVER); DefaultTransactionStatus status = newTransactionStatus( definition, transaction, true, newSynchronization, debugEnabled,
null); doBegin(transaction, definition); prepareSynchronization(status, definition); return status; } } //对于事务传播特性为supported和required的处理 if (debugEnabled) { logger.debug("Participating in existing transaction"); } //校验已存在的事务,如果已有事务与事务属性配置不一致,则抛出异常 if (isValidateExistingTransaction()) { //如果事务隔离级别不是默认隔离级别 if (definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT) { //获取当前事务的隔离级别 Integer currentIsolationLevel = TransactionSynchronizationManager.getCurrentTransactionIsolationLevel(); //如果获取到的当前事务隔离级别为null获取不等于事务属性配置的隔离级别 if (currentIsolationLevel == null || currentIsolationLevel != definition.getIsolationLevel()) { Constants isoConstants = DefaultTransactionDefinition.constants; throw new IllegalTransactionStateException("Participating transaction with definition [" + definition + "] specifies isolation level which is incompatible with existing transaction: " + (currentIsolationLevel != null isoConstants.toCode(currentIsolationLevel, DefaultTransactionDefinition.PREFIX_ISOLATION) : "(unknown)")); } } //如果事务不是只读 if (!definition.isReadOnly()) { //如果当前已有事务是只读 if (TransactionSynchronizationManager.isCurrentTransactionReadOnly()) { throw new IllegalTransactionStateException("Participating transaction with definition [" + definition + "] is not marked as read-only but existing transaction is"); } } } boolean newSynchronization = (getTransactionSynchronization() != SYNCHRONIZATION_NEVER); //返回当前事务的执行状态 return prepareTransactionStatus(definition, transact