Skip to content

Commit 6e539cf

Browse files
GH-2463 - Apply default transaction timeout if possible.
This applies the default transaction timeout of the platform transaction manager when the transaction definition is using the default.
1 parent f5ae77f commit 6e539cf

File tree

4 files changed

+42
-3
lines changed

4 files changed

+42
-3
lines changed

src/main/java/org/springframework/data/neo4j/core/transaction/Neo4jTransactionManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ protected boolean isExistingTransaction(Object transaction) throws TransactionEx
181181
protected void doBegin(Object transaction, TransactionDefinition definition) throws TransactionException {
182182
Neo4jTransactionObject transactionObject = extractNeo4jTransaction(transaction);
183183

184-
TransactionConfig transactionConfig = Neo4jTransactionUtils.createTransactionConfigFrom(definition);
184+
TransactionConfig transactionConfig = Neo4jTransactionUtils.createTransactionConfigFrom(definition, super.getDefaultTimeout());
185185
boolean readOnly = definition.isReadOnly();
186186

187187
TransactionSynchronizationManager.setCurrentTransactionReadOnly(readOnly);

src/main/java/org/springframework/data/neo4j/core/transaction/Neo4jTransactionUtils.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,10 @@ public static SessionConfig sessionConfig(boolean readOnly, Collection<Bookmark>
6464
* {@link TransactionDefinition#PROPAGATION_REQUIRED propagation required} behaviour are supported.
6565
*
6666
* @param definition The transaction definition passed to a Neo4j transaction manager
67+
* @param defaultTxManagerTimeout Default timeout from the tx manager (if available, if not, use something negative)
6768
* @return A Neo4j native transaction configuration
6869
*/
69-
static TransactionConfig createTransactionConfigFrom(TransactionDefinition definition) {
70+
static TransactionConfig createTransactionConfigFrom(TransactionDefinition definition, int defaultTxManagerTimeout) {
7071

7172
if (definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT) {
7273
throw new InvalidIsolationLevelException(
@@ -83,6 +84,8 @@ static TransactionConfig createTransactionConfigFrom(TransactionDefinition defin
8384
TransactionConfig.Builder builder = TransactionConfig.builder();
8485
if (definition.getTimeout() > 0) {
8586
builder = builder.withTimeout(Duration.ofSeconds(definition.getTimeout()));
87+
} else if (defaultTxManagerTimeout > 0) {
88+
builder = builder.withTimeout(Duration.ofSeconds(defaultTxManagerTimeout));
8689
}
8790

8891
return builder.build();

src/main/java/org/springframework/data/neo4j/core/transaction/ReactiveNeo4jTransactionManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ protected Mono<Void> doBegin(TransactionSynchronizationManager transactionSynchr
179179
return Mono.defer(() -> {
180180
ReactiveNeo4jTransactionObject transactionObject = extractNeo4jTransaction(transaction);
181181

182-
TransactionConfig transactionConfig = Neo4jTransactionUtils.createTransactionConfigFrom(transactionDefinition);
182+
TransactionConfig transactionConfig = Neo4jTransactionUtils.createTransactionConfigFrom(transactionDefinition, -1);
183183
boolean readOnly = transactionDefinition.isReadOnly();
184184

185185
transactionSynchronizationManager.setCurrentTransactionReadOnly(readOnly);

src/test/java/org/springframework/data/neo4j/core/transaction/Neo4jTransactionUtilsTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,22 @@
1515
*/
1616
package org.springframework.data.neo4j.core.transaction;
1717

18+
import static org.assertj.core.api.Assertions.assertThat;
19+
20+
import java.time.Duration;
21+
1822
import org.assertj.core.api.Assertions;
1923
import org.junit.jupiter.api.Nested;
24+
import org.junit.jupiter.api.Test;
2025
import org.junit.jupiter.api.extension.ExtendWith;
2126
import org.junit.jupiter.params.ParameterizedTest;
2227
import org.junit.jupiter.params.provider.CsvSource;
28+
import org.junit.jupiter.params.provider.ValueSource;
2329
import org.mockito.junit.jupiter.MockitoExtension;
2430
import org.mockito.junit.jupiter.MockitoSettings;
2531
import org.mockito.quality.Strictness;
32+
import org.neo4j.driver.TransactionConfig;
33+
import org.springframework.transaction.support.DefaultTransactionDefinition;
2634

2735
/**
2836
* @author Michael J. Simons
@@ -49,4 +57,32 @@ void nameComparisionShouldWorkForNamesTargetingOther(String name1, String name2)
4957
}
5058
}
5159

60+
@ParameterizedTest // GH-2463
61+
@ValueSource(ints = { Integer.MIN_VALUE, -1, 0, DefaultTransactionDefinition.TIMEOUT_DEFAULT })
62+
void shouldNotApplyNegativeOrZeroTimeOuts(int value) {
63+
64+
DefaultTransactionDefinition springDef = new DefaultTransactionDefinition();
65+
springDef.setTimeout(DefaultTransactionDefinition.TIMEOUT_DEFAULT);
66+
TransactionConfig driverConfig = Neo4jTransactionUtils.createTransactionConfigFrom(springDef, value);
67+
assertThat(driverConfig.timeout()).isNull();
68+
}
69+
70+
@ParameterizedTest // GH-2463
71+
@ValueSource(ints = { Integer.MIN_VALUE, -1, 0 })
72+
void shouldPreferTxDef(int value) {
73+
74+
DefaultTransactionDefinition springDef = new DefaultTransactionDefinition();
75+
springDef.setTimeout(2);
76+
TransactionConfig driverConfig = Neo4jTransactionUtils.createTransactionConfigFrom(springDef, value);
77+
assertThat(driverConfig.timeout()).isEqualTo(Duration.ofSeconds(2));
78+
}
79+
80+
@Test // GH-2463
81+
void shouldFallbackToTxManagerDefault() {
82+
83+
DefaultTransactionDefinition springDef = new DefaultTransactionDefinition();
84+
springDef.setTimeout(DefaultTransactionDefinition.TIMEOUT_DEFAULT);
85+
TransactionConfig driverConfig = Neo4jTransactionUtils.createTransactionConfigFrom(springDef, 3);
86+
assertThat(driverConfig.timeout()).isEqualTo(Duration.ofSeconds(3));
87+
}
5288
}

0 commit comments

Comments
 (0)