diff --git a/spring-tx/src/main/java/org/springframework/transaction/support/AbstractPlatformTransactionManager.java b/spring-tx/src/main/java/org/springframework/transaction/support/AbstractPlatformTransactionManager.java index 5a11d8f2201..c27156a33ca 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/support/AbstractPlatformTransactionManager.java +++ b/spring-tx/src/main/java/org/springframework/transaction/support/AbstractPlatformTransactionManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +25,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.core.Constants; +import org.springframework.lang.NonNull; import org.springframework.lang.Nullable; import org.springframework.transaction.IllegalTransactionStateException; import org.springframework.transaction.InvalidTimeoutException; @@ -370,12 +371,7 @@ public abstract class AbstractPlatformTransactionManager implements PlatformTran logger.debug("Creating new transaction with name [" + def.getName() + "]: " + def); } try { - boolean newSynchronization = (getTransactionSynchronization() != SYNCHRONIZATION_NEVER); - DefaultTransactionStatus status = newTransactionStatus( - def, transaction, true, newSynchronization, debugEnabled, suspendedResources); - doBegin(transaction, def); - prepareSynchronization(status, def); - return status; + return openNewTransaction(def, transaction, debugEnabled, suspendedResources); } catch (RuntimeException | Error ex) { resume(null, suspendedResources); @@ -393,6 +389,20 @@ public abstract class AbstractPlatformTransactionManager implements PlatformTran } } + /** + * Open a new transaction with transaction definition. + */ + @NonNull + private TransactionStatus openNewTransaction(TransactionDefinition def, Object transaction, + boolean debugEnabled, @Nullable SuspendedResourcesHolder suspendedResources) { + boolean newSynchronization = (getTransactionSynchronization() != SYNCHRONIZATION_NEVER); + DefaultTransactionStatus status = newTransactionStatus( + def, transaction, true, newSynchronization, debugEnabled, suspendedResources); + doBegin(transaction, def); + prepareSynchronization(status, def); + return status; + } + /** * Create a TransactionStatus for an existing transaction. */ @@ -422,12 +432,7 @@ public abstract class AbstractPlatformTransactionManager implements PlatformTran } SuspendedResourcesHolder suspendedResources = suspend(transaction); try { - boolean newSynchronization = (getTransactionSynchronization() != SYNCHRONIZATION_NEVER); - DefaultTransactionStatus status = newTransactionStatus( - definition, transaction, true, newSynchronization, debugEnabled, suspendedResources); - doBegin(transaction, definition); - prepareSynchronization(status, definition); - return status; + return openNewTransaction(definition, transaction, debugEnabled, suspendedResources); } catch (RuntimeException | Error beginEx) { resumeAfterBeginException(transaction, suspendedResources, beginEx); @@ -457,12 +462,7 @@ public abstract class AbstractPlatformTransactionManager implements PlatformTran // Nested transaction through nested begin and commit/rollback calls. // Usually only for JTA: Spring synchronization might get activated here // in case of a pre-existing JTA transaction. - boolean newSynchronization = (getTransactionSynchronization() != SYNCHRONIZATION_NEVER); - DefaultTransactionStatus status = newTransactionStatus( - definition, transaction, true, newSynchronization, debugEnabled, null); - doBegin(transaction, definition); - prepareSynchronization(status, definition); - return status; + return openNewTransaction(definition, transaction, debugEnabled, null); } }