From e9081a176fb942e156a2b5dcf0f69e724944c270 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Fri, 18 Dec 2020 14:14:43 +1300 Subject: [PATCH] #2133 - Spring transactions not getting ChangeLog changeSet as part of postCommit() processing --- .../io/ebeaninternal/api/SpiTransaction.java | 11 +++++++++++ .../ebeaninternal/api/SpiTransactionProxy.java | 9 +++++++++ .../transaction/ImplicitReadOnlyTransaction.java | 10 ++++++++++ .../server/transaction/JdbcTransaction.java | 14 ++++++++++++-- .../server/transaction/JtaTransaction.java | 16 +++++++--------- .../transaction/JtaTransactionManager.java | 8 +++----- .../server/transaction/NoTransaction.java | 10 ++++++++++ 7 files changed, 62 insertions(+), 16 deletions(-) diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/SpiTransaction.java b/ebean-core/src/main/java/io/ebeaninternal/api/SpiTransaction.java index 5e75831b5..0832a00b2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/SpiTransaction.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/SpiTransaction.java @@ -318,4 +318,15 @@ public interface SpiTransaction extends Transaction { * Return true if explicitly set to skip cache (ignores skipOnWrite). */ boolean isSkipCacheExplicit(); + + /** + * Fire post commit events and listeners. + */ + void postCommit(); + + /** + * Fire post rollback events and listeners. + */ + void postRollback(Throwable cause); + } diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/SpiTransactionProxy.java b/ebean-core/src/main/java/io/ebeaninternal/api/SpiTransactionProxy.java index 897a32f44..d87b5c744 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/SpiTransactionProxy.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/SpiTransactionProxy.java @@ -418,4 +418,13 @@ public abstract class SpiTransactionProxy implements SpiTransaction { transaction.flushBatchOnCollection(); } + @Override + public void postCommit() { + transaction.postCommit(); + } + + @Override + public void postRollback(Throwable cause) { + transaction.postRollback(cause); + } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/ImplicitReadOnlyTransaction.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/ImplicitReadOnlyTransaction.java index 53d266964..b890b3b50 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/ImplicitReadOnlyTransaction.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/ImplicitReadOnlyTransaction.java @@ -586,6 +586,16 @@ class ImplicitReadOnlyTransaction implements SpiTransaction, TxnProfileEventCode } } + @Override + public void postCommit() { + // do nothing + } + + @Override + public void postRollback(Throwable cause) { + // do nothing + } + /** * Return true if the transaction is active. */ 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 5f810dc17..1dbcfca67 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 @@ -985,6 +985,11 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { firePreCommit(); // only performCommit can throw an exception performCommit(); + postCommit(); + } + + @Override + public void postCommit() { firePostCommit(); notifyCommit(); } @@ -1132,11 +1137,16 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { } finally { // these will not throw an exception - firePostRollback(); - notifyRollback(cause); + postRollback(cause); } } + @Override + public void postRollback(Throwable cause) { + firePostRollback(); + notifyRollback(cause); + } + /** * If the transaction is active then perform rollback. */ diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JtaTransaction.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JtaTransaction.java index 811d9d1d6..e0c33a193 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JtaTransaction.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JtaTransaction.java @@ -13,9 +13,9 @@ public class JtaTransaction extends JdbcTransaction { private final UserTransaction userTransaction; - private boolean commmitted; + private final boolean newTransaction; - private boolean newTransaction; + private boolean committed; /** * Create the JtaTransaction. @@ -41,7 +41,6 @@ public class JtaTransaction extends JdbcTransaction { if (connection.getAutoCommit()) { connection.setAutoCommit(false); } - } catch (SQLException e) { throw new PersistenceException(e); } @@ -52,7 +51,7 @@ public class JtaTransaction extends JdbcTransaction { */ @Override public void commit() { - if (commmitted) { + if (committed) { throw new PersistenceException("This transaction has already been committed."); } try { @@ -60,14 +59,14 @@ public class JtaTransaction extends JdbcTransaction { if (newTransaction) { userTransaction.commit(); } - notifyCommit(); + postCommit(); } finally { close(); } } catch (Exception e) { throw new PersistenceException(e); } - commmitted = true; + committed = true; } @Override @@ -80,7 +79,7 @@ public class JtaTransaction extends JdbcTransaction { */ @Override public void rollback(Throwable e) { - if (!commmitted) { + if (!committed) { try { try { if (userTransaction != null) { @@ -90,7 +89,7 @@ public class JtaTransaction extends JdbcTransaction { userTransaction.setRollbackOnly(); } } - notifyRollback(e); + postRollback(e); } finally { closeConnection(); } @@ -98,7 +97,6 @@ public class JtaTransaction extends JdbcTransaction { throw new PersistenceException(ex); } } - } /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JtaTransactionManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JtaTransactionManager.java index 3fbed7d84..6362926e8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JtaTransactionManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/JtaTransactionManager.java @@ -190,19 +190,17 @@ public class JtaTransactionManager implements ExternalTransactionManager { @Override public void beforeCompletion() { - // Future note: for JPA2 locking we will - // have beforeCommit events to fire + transaction.flush(); } @Override public void afterCompletion(int status) { - switch (status) { case Status.STATUS_COMMITTED: if (logger.isDebugEnabled()) { logger.debug("Jta Txn [" + transaction.getId() + "] committed"); } - transactionManager.notifyOfCommit(transaction); + transaction.postCommit(); // Remove this transaction object as it is completed transactionManager.scope().clearExternal(); break; @@ -211,7 +209,7 @@ public class JtaTransactionManager implements ExternalTransactionManager { if (logger.isDebugEnabled()) { logger.debug("Jta Txn [" + transaction.getId() + "] rollback"); } - transactionManager.notifyOfRollback(transaction, null); + transaction.postRollback(null); // Remove this transaction object as it is completed transactionManager.scope().clearExternal(); break; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/NoTransaction.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/NoTransaction.java index 48476c14a..901b0faf0 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/NoTransaction.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/NoTransaction.java @@ -88,6 +88,16 @@ class NoTransaction implements SpiTransaction { // do nothing } + @Override + public void postCommit() { + // do nothing + } + + @Override + public void postRollback(Throwable cause) { + // do nothing + } + @Override public String getLogPrefix() { return null;