From 8840628d34082ddf0e5f281d73bac8dd29107c6d Mon Sep 17 00:00:00 2001 From: rbygrave Date: Tue, 13 Jul 2021 14:45:48 +1200 Subject: [PATCH] #2262 - Transaction postCommit Callback not invoked when the active transaction has no database writes --- .../server/transaction/JdbcTransaction.java | 2 ++ .../transaction/TestTransactionCallback.java | 30 +++++++++++++++---- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java index b4bd7b714..f61f03699 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java @@ -941,11 +941,13 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { */ private void connectionEndForQueryOnly() { try { + withEachCallback(TransactionCallback::preCommit); if (onQueryOnly == OnQueryOnly.COMMIT) { performCommit(); } else { performRollback(); } + withEachCallback(TransactionCallback::postCommit); } catch (SQLException e) { logger.error("Error when ending a query only transaction via " + onQueryOnly, e); } diff --git a/ebean-core/src/test/java/org/tests/transaction/TestTransactionCallback.java b/ebean-core/src/test/java/org/tests/transaction/TestTransactionCallback.java index 44e91f601..75ca4d567 100644 --- a/ebean-core/src/test/java/org/tests/transaction/TestTransactionCallback.java +++ b/ebean-core/src/test/java/org/tests/transaction/TestTransactionCallback.java @@ -1,10 +1,6 @@ package org.tests.transaction; -import io.ebean.BaseTestCase; -import io.ebean.Ebean; -import io.ebean.EbeanServer; -import io.ebean.Transaction; -import io.ebean.TransactionCallbackAdapter; +import io.ebean.*; import org.junit.Test; import javax.persistence.PersistenceException; @@ -50,8 +46,32 @@ public class TestTransactionCallback extends BaseTestCase { assertEquals(1, countPostCommit); assertEquals(1, countPreRollback); assertEquals(1, countPostRollback); + } + @Test + public void test_commit_whenNoDbWrite() { + try (Transaction txn = DB.beginTransaction()) { + DB.register(new MyCallback()); + txn.commit(); + } + assertEquals(1, countPreCommit); + assertEquals(1, countPostCommit); + assertEquals(0, countPreRollback); + assertEquals(0, countPostRollback); + } + + @Test + public void test_rollback_whenNoDbWrite() { + try (Transaction txn = DB.beginTransaction()) { + DB.register(new MyCallback()); + txn.rollback(); + } + + assertEquals(0, countPreCommit); + assertEquals(0, countPostCommit); + assertEquals(1, countPreRollback); + assertEquals(1, countPostRollback); } @Test(expected = PersistenceException.class)