diff --git a/driver/src/main/java/org/neo4j/driver/internal/async/UnmanagedTransaction.java b/driver/src/main/java/org/neo4j/driver/internal/async/UnmanagedTransaction.java index 8daa471bd7..1bdba867a7 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/async/UnmanagedTransaction.java +++ b/driver/src/main/java/org/neo4j/driver/internal/async/UnmanagedTransaction.java @@ -320,7 +320,10 @@ public CompletionStage terminateAsync() { @Override public T execute(Function causeOfTerminationConsumer) { - return executeWithLock(lock, () -> causeOfTerminationConsumer.apply(causeOfTermination)); + return executeWithLock(lock, () -> { + var throwable = causeOfTermination == null ? null : failedTxException(causeOfTermination); + return causeOfTerminationConsumer.apply(throwable); + }); } private void ensureCanRunQueries() { @@ -347,15 +350,7 @@ private void ensureCanRunQueries() { if (causeOfTermination instanceof TransactionTerminatedException transactionTerminatedException) { throw transactionTerminatedException; } else { - var message = - "Cannot run more queries in this transaction, it has either experienced an fatal error or was explicitly terminated"; - throw new TransactionTerminatedException( - GqlStatusError.UNKNOWN.getStatus(), - GqlStatusError.UNKNOWN.getStatusDescription(message), - "N/A", - message, - GqlStatusError.DIAGNOSTIC_RECORD, - causeOfTermination); + throw failedTxException(causeOfTermination); } } else if (commitFuture != null) { var message = "Cannot run more queries in this transaction, it is being committed"; @@ -578,6 +573,18 @@ private CompletionStage closeAsync(boolean commit, boolean completeWithNul return stage; } + private static TransactionTerminatedException failedTxException(Throwable cause) { + var message = + "Cannot run more queries in this transaction, it has either experienced a fatal error or was explicitly terminated"; + return new TransactionTerminatedException( + GqlStatusError.UNKNOWN.getStatus(), + GqlStatusError.UNKNOWN.getStatusDescription(message), + "N/A", + message, + GqlStatusError.DIAGNOSTIC_RECORD, + cause); + } + private static class BeginResponseHandler implements DriverResponseHandler { final CompletableFuture summaryFuture = new CompletableFuture<>(); private final ApiTelemetryWork apiTelemetryWork; diff --git a/driver/src/test/java/org/neo4j/driver/integration/TransactionIT.java b/driver/src/test/java/org/neo4j/driver/integration/TransactionIT.java index 1c444cd0f6..df72872f1c 100644 --- a/driver/src/test/java/org/neo4j/driver/integration/TransactionIT.java +++ b/driver/src/test/java/org/neo4j/driver/integration/TransactionIT.java @@ -422,7 +422,7 @@ void shouldPreventPullAfterTransactionTermination(boolean iterate) { result.list(); } }); - assertEquals(terminationException, exception); + assertEquals(terminationException, exception.getCause()); } tx.close(); } @@ -441,8 +441,8 @@ void shouldPreventDiscardAfterTransactionTermination() { // Then for (var result : List.of(result0, result1)) { - var exception = assertThrows(ClientException.class, result::consume); - assertEquals(terminationException, exception); + var exception = assertThrows(TransactionTerminatedException.class, result::consume); + assertEquals(terminationException, exception.getCause()); } tx.close(); } diff --git a/driver/src/test/java/org/neo4j/driver/integration/reactive/ReactiveTransactionIT.java b/driver/src/test/java/org/neo4j/driver/integration/reactive/ReactiveTransactionIT.java index b792d3e727..6243b54a63 100644 --- a/driver/src/test/java/org/neo4j/driver/integration/reactive/ReactiveTransactionIT.java +++ b/driver/src/test/java/org/neo4j/driver/integration/reactive/ReactiveTransactionIT.java @@ -63,7 +63,7 @@ void shouldPreventPullAfterTransactionTermination() { for (var result : List.of(result0, result1)) { var exception = assertThrows( ClientException.class, () -> Flux.from(result.records()).blockFirst()); - assertEquals(terminationException, exception); + assertEquals(terminationException, exception.getCause()); } Mono.fromDirect(tx.close()).block(); } @@ -92,7 +92,7 @@ void shouldPreventDiscardAfterTransactionTermination() { for (var result : List.of(result0, result1)) { var exception = assertThrows(ClientException.class, () -> Mono.fromDirect(result.consume()) .block()); - assertEquals(terminationException, exception); + assertEquals(terminationException, exception.getCause()); } Mono.fromDirect(tx.close()).block(); }