|
16 | 16 |
|
17 | 17 | package org.springframework.transaction.support;
|
18 | 18 |
|
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 |
| - |
25 | 19 | import org.junit.jupiter.api.AfterEach;
|
26 | 20 | import org.junit.jupiter.api.Nested;
|
27 | 21 | 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.*; |
34 | 23 | import org.springframework.transaction.testfixture.MockCallbackPreferringTransactionManager;
|
35 | 24 | import org.springframework.transaction.testfixture.TestTransactionExecutionListener;
|
36 | 25 | import org.springframework.util.ReflectionUtils;
|
37 | 26 |
|
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; |
47 | 36 | import static org.springframework.transaction.support.AbstractPlatformTransactionManager.SYNCHRONIZATION_ON_ACTUAL_TRANSACTION;
|
48 | 37 | import static org.springframework.transaction.support.DefaultTransactionDefinition.PREFIX_ISOLATION;
|
49 | 38 | import static org.springframework.transaction.support.DefaultTransactionDefinition.PREFIX_PROPAGATION;
|
@@ -78,6 +67,58 @@ void noExistingTransaction() {
|
78 | 67 | .isThrownBy(() -> tm.getTransaction(new DefaultTransactionDefinition(PROPAGATION_MANDATORY)));
|
79 | 68 | }
|
80 | 69 |
|
| 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 | + |
81 | 122 | @Test
|
82 | 123 | void existingTransaction() {
|
83 | 124 | PlatformTransactionManager tm = new TestTransactionManager(true, true);
|
|
0 commit comments