Skip to content

Commit fe2b40c

Browse files
committed
add suspend when new transaction with propagation supports, never, not supports
Signed-off-by: 정태혁 <[email protected]>
1 parent 46e6783 commit fe2b40c

File tree

2 files changed

+64
-22
lines changed

2 files changed

+64
-22
lines changed

spring-tx/src/main/java/org/springframework/transaction/support/AbstractPlatformTransactionManager.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,8 @@ else if (def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUI
416416
"isolation level will effectively be ignored: " + def);
417417
}
418418
boolean newSynchronization = (getTransactionSynchronization() == SYNCHRONIZATION_ALWAYS);
419-
return prepareTransactionStatus(def, null, true, newSynchronization, debugEnabled, null);
419+
SuspendedResourcesHolder suspendedResources = suspend(null);
420+
return prepareTransactionStatus(def, null, true, newSynchronization, debugEnabled, suspendedResources);
420421
}
421422
}
422423

spring-tx/src/test/java/org/springframework/transaction/support/TransactionSupportTests.java

Lines changed: 62 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,34 +16,23 @@
1616

1717
package org.springframework.transaction.support;
1818

19-
import java.lang.reflect.Field;
20-
import java.util.Arrays;
21-
import java.util.HashSet;
22-
import java.util.Set;
23-
import java.util.stream.Stream;
24-
2519
import org.junit.jupiter.api.AfterEach;
2620
import org.junit.jupiter.api.Nested;
2721
import org.junit.jupiter.api.Test;
28-
29-
import org.springframework.transaction.IllegalTransactionStateException;
30-
import org.springframework.transaction.PlatformTransactionManager;
31-
import org.springframework.transaction.TransactionDefinition;
32-
import org.springframework.transaction.TransactionStatus;
33-
import org.springframework.transaction.TransactionSystemException;
22+
import org.springframework.transaction.*;
3423
import org.springframework.transaction.testfixture.MockCallbackPreferringTransactionManager;
3524
import org.springframework.transaction.testfixture.TestTransactionExecutionListener;
3625
import org.springframework.util.ReflectionUtils;
3726

38-
import static org.assertj.core.api.Assertions.assertThat;
39-
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
40-
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
41-
import static org.assertj.core.api.Assertions.assertThatRuntimeException;
42-
import static org.springframework.transaction.TransactionDefinition.ISOLATION_REPEATABLE_READ;
43-
import static org.springframework.transaction.TransactionDefinition.ISOLATION_SERIALIZABLE;
44-
import static org.springframework.transaction.TransactionDefinition.PROPAGATION_MANDATORY;
45-
import static org.springframework.transaction.TransactionDefinition.PROPAGATION_REQUIRED;
46-
import static org.springframework.transaction.TransactionDefinition.PROPAGATION_SUPPORTS;
27+
import java.lang.reflect.Field;
28+
import java.util.Arrays;
29+
import java.util.HashSet;
30+
import java.util.Set;
31+
import java.util.stream.Stream;
32+
33+
import static org.assertj.core.api.Assertions.*;
34+
import static org.springframework.transaction.TransactionDefinition.*;
35+
import static org.springframework.transaction.support.AbstractPlatformTransactionManager.SYNCHRONIZATION_ALWAYS;
4736
import static org.springframework.transaction.support.AbstractPlatformTransactionManager.SYNCHRONIZATION_ON_ACTUAL_TRANSACTION;
4837
import static org.springframework.transaction.support.DefaultTransactionDefinition.PREFIX_ISOLATION;
4938
import static org.springframework.transaction.support.DefaultTransactionDefinition.PREFIX_PROPAGATION;
@@ -78,6 +67,58 @@ void noExistingTransaction() {
7867
.isThrownBy(() -> tm.getTransaction(new DefaultTransactionDefinition(PROPAGATION_MANDATORY)));
7968
}
8069

70+
@Test
71+
void noExistingTransactionWithExistingAnotherTransactionManager() {
72+
AbstractPlatformTransactionManager tm1 = new TestTransactionManager(false, true);
73+
tm1.setTransactionSynchronization(SYNCHRONIZATION_ALWAYS);
74+
75+
DefaultTransactionDefinition txDef1 =
76+
new DefaultTransactionDefinition(PROPAGATION_REQUIRED);
77+
txDef1.setName("tx1");
78+
txDef1.setReadOnly(false);
79+
txDef1.setIsolationLevel(ISOLATION_READ_COMMITTED);
80+
81+
DefaultTransactionStatus txStatus1 = (DefaultTransactionStatus)tm1.getTransaction(txDef1);
82+
83+
// assert for txStatus1 and TransactionSynchronizationManager property
84+
assertThat(txStatus1.hasTransaction()).as("Must have transaction").isTrue();
85+
assertThat(txStatus1.isNewTransaction()).as("Must be new transaction").isTrue();
86+
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly())
87+
.as("Transaction1 Must be readOnly false")
88+
.isEqualTo(txStatus1.isReadOnly());
89+
assertThat(TransactionSynchronizationManager.getCurrentTransactionName())
90+
.as("TransactionSynchronizationManager have correct transaction name")
91+
.isEqualTo(txStatus1.getTransactionName());
92+
assertThat(TransactionSynchronizationManager.getCurrentTransactionIsolationLevel())
93+
.as("isolation level must be default").isNull();
94+
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isTrue();
95+
96+
// Setting another trnasaction manager
97+
AbstractPlatformTransactionManager tm2 = new TestTransactionManager(false, true);
98+
tm2.setTransactionSynchronization(SYNCHRONIZATION_ALWAYS);
99+
100+
// Opening a new transaction before `transaction 1` commits.
101+
DefaultTransactionDefinition txDef2 =
102+
new DefaultTransactionDefinition(PROPAGATION_SUPPORTS);
103+
txDef2.setReadOnly(true);
104+
txDef2.setIsolationLevel(ISOLATION_REPEATABLE_READ);
105+
txDef2.setName("tx2");
106+
107+
// assert for txStatus1 and TransactionSynchronizationManager property
108+
DefaultTransactionStatus txStatus2 = (DefaultTransactionStatus)
109+
tm2.getTransaction(txDef2);
110+
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).as("Must not have transaction")
111+
.isEqualTo(txStatus2.hasTransaction());
112+
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).as("Must be readOnly true")
113+
.isEqualTo(txStatus2.isReadOnly());
114+
assertThat(TransactionSynchronizationManager.getCurrentTransactionIsolationLevel())
115+
.as("isolation level must be Repeatable Read")
116+
.isEqualTo(ISOLATION_REPEATABLE_READ);
117+
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isTrue();
118+
119+
TransactionSynchronizationManager.clearSynchronization();
120+
}
121+
81122
@Test
82123
void existingTransaction() {
83124
PlatformTransactionManager tm = new TestTransactionManager(true, true);

0 commit comments

Comments
 (0)