diff --git a/hibernate-core/src/main/java/org/hibernate/engine/internal/AfterTransactionCompletionProcessQueue.java b/hibernate-core/src/main/java/org/hibernate/engine/internal/AfterTransactionCompletionProcessQueue.java index ddcd55f70d84..daf2ba616261 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/internal/AfterTransactionCompletionProcessQueue.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/internal/AfterTransactionCompletionProcessQueue.java @@ -12,6 +12,7 @@ import org.hibernate.engine.spi.TransactionCompletionCallbacks.AfterCompletionCallback; import java.util.HashSet; +import java.util.Iterator; import java.util.Set; import static org.hibernate.internal.CoreMessageLogger.CORE_LOGGER; @@ -62,13 +63,15 @@ void afterTransactionCompletion(boolean success) { } void executePendingBulkOperationCleanUpActions() { - AfterCompletionCallback process; boolean hasPendingBulkOperationCleanUpActions = false; - while ( ( process = processes.poll() ) != null ) { + Iterator iterator = processes.iterator(); + while ( iterator.hasNext() ) { + AfterCompletionCallback process = iterator.next(); if ( process instanceof BulkOperationCleanupAction.BulkOperationCleanUpAfterTransactionCompletionProcess ) { try { hasPendingBulkOperationCleanUpActions = true; process.doAfterTransactionCompletion( true, session ); + iterator.remove(); } catch (CacheException ce) { CORE_LOGGER.unableToReleaseCacheLock( ce );