From 3c2590d339e163f760b89a445f1ac214da6fc3df Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 13 Jun 2023 12:57:52 +0200 Subject: [PATCH] Document limited isolation level support for concurrent transactions See gh-29997 --- .../orm/jpa/vendor/EclipseLinkJpaDialect.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/EclipseLinkJpaDialect.java b/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/EclipseLinkJpaDialect.java index 4c0ab302aa..a02e4a8fb4 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/EclipseLinkJpaDialect.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/EclipseLinkJpaDialect.java @@ -36,14 +36,20 @@ import org.springframework.transaction.TransactionException; * Persistence Services (EclipseLink). Developed and tested against EclipseLink 2.7; * backwards-compatible with EclipseLink 2.5 and 2.6 at runtime. * - *

By default, this class acquires an early EclipseLink transaction with an early - * JDBC Connection for non-read-only transactions. This allows for mixing JDBC and - * JPA/EclipseLink operations in the same transaction, with cross visibility of + *

By default, this dialect acquires an early EclipseLink transaction with an + * early JDBC Connection for non-read-only transactions. This allows for mixing + * JDBC and JPA operations in the same transaction, with cross visibility of * their impact. If this is not needed, set the "lazyDatabaseTransaction" flag to * {@code true} or consistently declare all affected transactions as read-only. * As of Spring 4.1.2, this will reliably avoid early JDBC Connection retrieval * and therefore keep EclipseLink in shared cache mode. * + *

NOTE: This dialect supports custom isolation levels with limitations. + * Consistent isolation level handling is only guaranteed when all Spring transaction + * definitions specify a concrete isolation level, without any default transactions + * running concurrently. Otherwise, you may see non-default isolation levels exposed + * to default transactions when custom isolation is used in concurrent transactions. + * * @author Juergen Hoeller * @since 2.5.2 * @see #setLazyDatabaseTransaction @@ -85,7 +91,8 @@ public class EclipseLinkJpaDialect extends DefaultJpaDialect { // (since Spring 4.1.2 / revised in 5.3.28) UnitOfWork uow = entityManager.unwrap(UnitOfWork.class); DatabaseLogin databaseLogin = uow.getLogin(); - // Synchronize on shared DatabaseLogin instance (-> concurrent transactions) + // Synchronize on shared DatabaseLogin instance for consistent isolation level + // set and reset in case of concurrent transactions with different isolation. synchronized (databaseLogin) { int originalIsolationLevel = databaseLogin.getTransactionIsolation(); // Apply current isolation level value, if necessary.