Skip to content

Commit 7e58d83

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. Closes #2463
1 parent aab50ea commit 7e58d83

File tree

4 files changed

+41
-3
lines changed

4 files changed

+41
-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
@@ -288,7 +288,7 @@ protected boolean isExistingTransaction(Object transaction) throws TransactionEx
288288
protected void doBegin(Object transaction, TransactionDefinition definition) throws TransactionException {
289289
Neo4jTransactionObject transactionObject = extractNeo4jTransaction(transaction);
290290

291-
TransactionConfig transactionConfig = Neo4jTransactionUtils.createTransactionConfigFrom(definition);
291+
TransactionConfig transactionConfig = Neo4jTransactionUtils.createTransactionConfigFrom(definition, super.getDefaultTimeout());
292292
boolean readOnly = definition.isReadOnly();
293293

294294
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
@@ -87,9 +87,10 @@ public static SessionConfig sessionConfig(boolean readOnly, Collection<Bookmark>
8787
* {@link TransactionDefinition#PROPAGATION_REQUIRED propagation required} behaviour are supported.
8888
*
8989
* @param definition The transaction definition passed to a Neo4j transaction manager
90+
* @param defaultTxManagerTimeout Default timeout from the tx manager (if available, if not, use something negative)
9091
* @return A Neo4j native transaction configuration
9192
*/
92-
static TransactionConfig createTransactionConfigFrom(TransactionDefinition definition) {
93+
static TransactionConfig createTransactionConfigFrom(TransactionDefinition definition, int defaultTxManagerTimeout) {
9394

9495
if (definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT) {
9596
throw new InvalidIsolationLevelException(
@@ -106,6 +107,8 @@ static TransactionConfig createTransactionConfigFrom(TransactionDefinition defin
106107
TransactionConfig.Builder builder = TransactionConfig.builder();
107108
if (definition.getTimeout() > 0) {
108109
builder = builder.withTimeout(Duration.ofSeconds(definition.getTimeout()));
110+
} else if (defaultTxManagerTimeout > 0) {
111+
builder = builder.withTimeout(Duration.ofSeconds(defaultTxManagerTimeout));
109112
}
110113

111114
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
@@ -288,7 +288,7 @@ protected Mono<Void> doBegin(TransactionSynchronizationManager transactionSynchr
288288
return Mono.defer(() -> {
289289
ReactiveNeo4jTransactionObject transactionObject = extractNeo4jTransaction(transaction);
290290

291-
TransactionConfig transactionConfig = Neo4jTransactionUtils.createTransactionConfigFrom(transactionDefinition);
291+
TransactionConfig transactionConfig = Neo4jTransactionUtils.createTransactionConfigFrom(transactionDefinition, -1);
292292
boolean readOnly = transactionDefinition.isReadOnly();
293293

294294
transactionSynchronizationManager.setCurrentTransactionReadOnly(readOnly);

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,16 @@
1717

1818
import static org.assertj.core.api.Assertions.assertThat;
1919

20+
import java.time.Duration;
21+
22+
import org.junit.jupiter.api.Test;
2023
import org.junit.jupiter.params.ParameterizedTest;
2124
import org.junit.jupiter.params.provider.CsvSource;
25+
import org.junit.jupiter.params.provider.ValueSource;
26+
import org.neo4j.driver.TransactionConfig;
2227
import org.springframework.data.neo4j.core.DatabaseSelection;
2328
import org.springframework.data.neo4j.core.UserSelection;
29+
import org.springframework.transaction.support.DefaultTransactionDefinition;
2430
import org.springframework.util.StringUtils;
2531

2632
/**
@@ -57,4 +63,33 @@ void formatOngoingTxInAnotherDbErrorMessageShouldWork(String cdb, String rdb, St
5763
);
5864
assertThat(result).isEqualTo(expected);
5965
}
66+
67+
@ParameterizedTest // GH-2463
68+
@ValueSource(ints = {Integer.MIN_VALUE, -1, 0, DefaultTransactionDefinition.TIMEOUT_DEFAULT})
69+
void shouldNotApplyNegativeOrZeroTimeOuts(int value) {
70+
71+
DefaultTransactionDefinition springDef = new DefaultTransactionDefinition();
72+
springDef.setTimeout(DefaultTransactionDefinition.TIMEOUT_DEFAULT);
73+
TransactionConfig driverConfig = Neo4jTransactionUtils.createTransactionConfigFrom(springDef, value);
74+
assertThat(driverConfig.timeout()).isNull();
75+
}
76+
77+
@ParameterizedTest // GH-2463
78+
@ValueSource(ints = {Integer.MIN_VALUE, -1, 0})
79+
void shouldPreferTxDef(int value) {
80+
81+
DefaultTransactionDefinition springDef = new DefaultTransactionDefinition();
82+
springDef.setTimeout(2);
83+
TransactionConfig driverConfig = Neo4jTransactionUtils.createTransactionConfigFrom(springDef, value);
84+
assertThat(driverConfig.timeout()).isEqualTo(Duration.ofSeconds(2));
85+
}
86+
87+
@Test // GH-2463
88+
void shouldFallbackToTxManagerDefault() {
89+
90+
DefaultTransactionDefinition springDef = new DefaultTransactionDefinition();
91+
springDef.setTimeout(DefaultTransactionDefinition.TIMEOUT_DEFAULT);
92+
TransactionConfig driverConfig = Neo4jTransactionUtils.createTransactionConfigFrom(springDef, 3);
93+
assertThat(driverConfig.timeout()).isEqualTo(Duration.ofSeconds(3));
94+
}
6095
}

0 commit comments

Comments
 (0)