avoid Synchronization List preparations upfront if possible (SPR-6999)
This commit is contained in:
parent
4c0744ee54
commit
19b4618fb5
|
|
@ -352,7 +352,9 @@ public class WebSphereUowTransactionManager extends JtaTransactionManager
|
||||||
if (status.isNewSynchronization()) {
|
if (status.isNewSynchronization()) {
|
||||||
List<TransactionSynchronization> synchronizations = TransactionSynchronizationManager.getSynchronizations();
|
List<TransactionSynchronization> synchronizations = TransactionSynchronizationManager.getSynchronizations();
|
||||||
TransactionSynchronizationManager.clear();
|
TransactionSynchronizationManager.clear();
|
||||||
uowManager.registerInterposedSynchronization(new JtaAfterCompletionSynchronization(synchronizations));
|
if (!synchronizations.isEmpty()) {
|
||||||
|
uowManager.registerInterposedSynchronization(new JtaAfterCompletionSynchronization(synchronizations));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2009 the original author or authors.
|
* Copyright 2002-2010 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -970,7 +970,7 @@ public abstract class AbstractPlatformTransactionManager implements PlatformTran
|
||||||
// invoke the afterCompletion callbacks immediately
|
// invoke the afterCompletion callbacks immediately
|
||||||
invokeAfterCompletion(synchronizations, completionStatus);
|
invokeAfterCompletion(synchronizations, completionStatus);
|
||||||
}
|
}
|
||||||
else {
|
else if (!synchronizations.isEmpty()) {
|
||||||
// Existing transaction that we participate in, controlled outside
|
// Existing transaction that we participate in, controlled outside
|
||||||
// of the scope of this Spring transaction manager -> try to register
|
// of the scope of this Spring transaction manager -> try to register
|
||||||
// an afterCompletion callback with the existing (JTA) transaction.
|
// an afterCompletion callback with the existing (JTA) transaction.
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2009 the original author or authors.
|
* Copyright 2002-2010 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -287,16 +287,21 @@ public abstract class TransactionSynchronizationManager {
|
||||||
* @see TransactionSynchronization
|
* @see TransactionSynchronization
|
||||||
*/
|
*/
|
||||||
public static List<TransactionSynchronization> getSynchronizations() throws IllegalStateException {
|
public static List<TransactionSynchronization> getSynchronizations() throws IllegalStateException {
|
||||||
if (!isSynchronizationActive()) {
|
List<TransactionSynchronization> synchs = synchronizations.get();
|
||||||
|
if (synchs == null) {
|
||||||
throw new IllegalStateException("Transaction synchronization is not active");
|
throw new IllegalStateException("Transaction synchronization is not active");
|
||||||
}
|
}
|
||||||
List<TransactionSynchronization> synchs = synchronizations.get();
|
|
||||||
// Sort lazily here, not in registerSynchronization.
|
|
||||||
OrderComparator.sort(synchs);
|
|
||||||
// Return unmodifiable snapshot, to avoid ConcurrentModificationExceptions
|
// Return unmodifiable snapshot, to avoid ConcurrentModificationExceptions
|
||||||
// while iterating and invoking synchronization callbacks that in turn
|
// while iterating and invoking synchronization callbacks that in turn
|
||||||
// might register further synchronizations.
|
// might register further synchronizations.
|
||||||
return Collections.unmodifiableList(new ArrayList<TransactionSynchronization>(synchs));
|
if (synchs.isEmpty()) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Sort lazily here, not in registerSynchronization.
|
||||||
|
OrderComparator.sort(synchs);
|
||||||
|
return Collections.unmodifiableList(new ArrayList<TransactionSynchronization>(synchs));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -359,9 +364,6 @@ public abstract class TransactionSynchronizationManager {
|
||||||
* flush mode of a Hibernate Session to "FlushMode.NEVER" upfront.
|
* flush mode of a Hibernate Session to "FlushMode.NEVER" upfront.
|
||||||
* @see org.springframework.transaction.TransactionDefinition#isReadOnly()
|
* @see org.springframework.transaction.TransactionDefinition#isReadOnly()
|
||||||
* @see TransactionSynchronization#beforeCommit(boolean)
|
* @see TransactionSynchronization#beforeCommit(boolean)
|
||||||
* @see org.hibernate.Session#flush
|
|
||||||
* @see org.hibernate.Session#setFlushMode
|
|
||||||
* @see org.hibernate.FlushMode#NEVER
|
|
||||||
*/
|
*/
|
||||||
public static boolean isCurrentTransactionReadOnly() {
|
public static boolean isCurrentTransactionReadOnly() {
|
||||||
return (currentTransactionReadOnly.get() != null);
|
return (currentTransactionReadOnly.get() != null);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue