From 600ac88b98bdc9b70d8b11ba2ba2a5a278971720 Mon Sep 17 00:00:00 2001 From: Arjav Desai Date: Thu, 15 Dec 2022 14:05:42 -0600 Subject: [PATCH] Handle exception on inTransaction apply (#5700) --- .../reactive/dbclient/jdbc/JdbcDbClient.java | 9 ++++++++- .../reactive/dbclient/jdbc/JdbcClientTest.java | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/reactive/dbclient/jdbc/src/main/java/io/helidon/reactive/dbclient/jdbc/JdbcDbClient.java b/reactive/dbclient/jdbc/src/main/java/io/helidon/reactive/dbclient/jdbc/JdbcDbClient.java index 37fe1dd3c4d..a4e860b08f4 100644 --- a/reactive/dbclient/jdbc/src/main/java/io/helidon/reactive/dbclient/jdbc/JdbcDbClient.java +++ b/reactive/dbclient/jdbc/src/main/java/io/helidon/reactive/dbclient/jdbc/JdbcDbClient.java @@ -79,7 +79,14 @@ public > T inTransaction(Function dbMapperManager, mapperManager); - T result = executor.apply(execute); + T result; + + try { + result = executor.apply(execute); + } catch (RuntimeException e) { + execute.doRollback(); + throw e; + } if (result instanceof Multi) { Multi multi = (Multi) result; diff --git a/reactive/dbclient/jdbc/src/test/java/io/helidon/reactive/dbclient/jdbc/JdbcClientTest.java b/reactive/dbclient/jdbc/src/test/java/io/helidon/reactive/dbclient/jdbc/JdbcClientTest.java index 3edf3ccc404..845432fb0b9 100644 --- a/reactive/dbclient/jdbc/src/test/java/io/helidon/reactive/dbclient/jdbc/JdbcClientTest.java +++ b/reactive/dbclient/jdbc/src/test/java/io/helidon/reactive/dbclient/jdbc/JdbcClientTest.java @@ -65,6 +65,24 @@ void txErrorHandling() { assertThat("Wrong exception propagated.", ((RuntimeException) result).getMessage(), is(equalTo(message))); } + @Test + void txExceptionHandling() { + String message = "BOOM IN TX!!!"; + + JdbcDbClient dbClient = (JdbcDbClient) JdbcDbClientProviderBuilder.create() + .connectionPool(POOL) + .build(); + try { + dbClient.inTransaction(tx -> { + throw new RuntimeException(message); + }); + } catch (RuntimeException result) { + assertThat("Wrong exception propagated.", result.getMessage(), is(equalTo(message))); + return; + } + fail("Wrong (or no) exception propagated, expected RuntimeException!"); + } + @Test void txResultHandling() { JdbcDbClient dbClient = (JdbcDbClient) JdbcDbClientProviderBuilder.create()