diff --git a/src/main/java/io/r2dbc/pool/PooledConnection.java b/src/main/java/io/r2dbc/pool/PooledConnection.java index aff2c09..f691efa 100644 --- a/src/main/java/io/r2dbc/pool/PooledConnection.java +++ b/src/main/java/io/r2dbc/pool/PooledConnection.java @@ -114,7 +114,7 @@ public Mono close() { @Override public Mono commitTransaction() { assertNotClosed(); - return Mono.from(this.connection.commitTransaction()).doOnSubscribe(ignore -> this.inTransaction = false); + return Mono.from(this.connection.commitTransaction()).doOnSuccess(ignore -> this.inTransaction = false); } @Override diff --git a/src/test/java/io/r2dbc/pool/PooledConnectionUnitTests.java b/src/test/java/io/r2dbc/pool/PooledConnectionUnitTests.java index 8e99ed6..da1124b 100644 --- a/src/test/java/io/r2dbc/pool/PooledConnectionUnitTests.java +++ b/src/test/java/io/r2dbc/pool/PooledConnectionUnitTests.java @@ -123,6 +123,23 @@ void committedTransactionLeavesTransactionalStateAsIs() { verify(connectionMock, never()).rollbackTransaction(); } + @Test + void failedCommitShouldRollbackOnClose() { + + AtomicBoolean rollbackCalled = new AtomicBoolean(); + when(connectionMock.commitTransaction()).thenReturn(Mono.error(new RuntimeException("commit failed"))); + when(connectionMock.rollbackTransaction()).thenReturn(Mono.empty().doOnSuccess(o -> rollbackCalled.set(true))); + + PooledConnection connection = new PooledConnection(pooledRefMock); + connection.beginTransaction().as(StepVerifier::create).verifyComplete(); + connection.commitTransaction().as(StepVerifier::create).verifyError(); + + connection.close().as(StepVerifier::create).verifyComplete(); + + verify(connectionMock).rollbackTransaction(); + assertThat(rollbackCalled).isTrue(); + } + @Test void rolledBackTransactionLeavesTransactionalStateAsIs() {