From 4b8881c64f2099aae2164505b616c040426d1191 Mon Sep 17 00:00:00 2001 From: Martin Panzer Date: Sat, 12 Dec 2020 21:42:03 +0100 Subject: [PATCH] Ensure that suspended transaction is always resumed If an exception happen inside commit (like an SQLException), the afterEndTransaction Runnable would not run. This caused the suspended Transaction to be never resumed, for e.g. a nested Transaction REQUIRES_NEW. --- .../TransactionalInterceptorBase.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/extensions/narayana-jta/runtime/src/main/java/io/quarkus/narayana/jta/runtime/interceptor/TransactionalInterceptorBase.java b/extensions/narayana-jta/runtime/src/main/java/io/quarkus/narayana/jta/runtime/interceptor/TransactionalInterceptorBase.java index ba67fde04a12a..24b599c3e6e32 100644 --- a/extensions/narayana-jta/runtime/src/main/java/io/quarkus/narayana/jta/runtime/interceptor/TransactionalInterceptorBase.java +++ b/extensions/narayana-jta/runtime/src/main/java/io/quarkus/narayana/jta/runtime/interceptor/TransactionalInterceptorBase.java @@ -301,17 +301,19 @@ protected void handleException(InvocationContext ic, Exception e, Transaction tx protected void endTransaction(TransactionManager tm, Transaction tx, RunnableWithException afterEndTransaction) throws Exception { - if (tx != tm.getTransaction()) { - throw new RuntimeException(jtaLogger.i18NLogger.get_wrong_tx_on_thread()); - } + try { + if (tx != tm.getTransaction()) { + throw new RuntimeException(jtaLogger.i18NLogger.get_wrong_tx_on_thread()); + } - if (tx.getStatus() == Status.STATUS_MARKED_ROLLBACK) { - tm.rollback(); - } else { - tm.commit(); + if (tx.getStatus() == Status.STATUS_MARKED_ROLLBACK) { + tm.rollback(); + } else { + tm.commit(); + } + } finally { + afterEndTransaction.run(); } - - afterEndTransaction.run(); } protected boolean setUserTransactionAvailable(boolean available) {