Consistent support for JPA 3.2 transaction timeout

Closes gh-35663
This commit is contained in:
Juergen Hoeller
2025-10-18 15:44:41 +02:00
parent b261b74793
commit c063249bd4
3 changed files with 19 additions and 1 deletions
@@ -59,11 +59,16 @@ public class DefaultJpaDialect implements JpaDialect, Serializable {
public @Nullable Object beginTransaction(EntityManager entityManager, TransactionDefinition definition)
throws PersistenceException, SQLException, TransactionException {
if (definition.getTimeout() != TransactionDefinition.TIMEOUT_DEFAULT) {
entityManager.getTransaction().setTimeout(definition.getTimeout());
}
if (definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT) {
throw new InvalidIsolationLevelException(getClass().getSimpleName() +
" does not support custom isolation levels due to limitations in standard JPA. " +
"Specific arrangements may be implemented in custom JpaDialect variants.");
}
entityManager.getTransaction().begin();
return null;
}
@@ -99,6 +99,10 @@ public class EclipseLinkJpaDialect extends DefaultJpaDialect {
public @Nullable Object beginTransaction(EntityManager entityManager, TransactionDefinition definition)
throws PersistenceException, SQLException, TransactionException {
if (definition.getTimeout() != TransactionDefinition.TIMEOUT_DEFAULT) {
entityManager.getTransaction().setTimeout(definition.getTimeout());
}
int currentIsolationLevel = definition.getIsolationLevel();
if (currentIsolationLevel != TransactionDefinition.ISOLATION_DEFAULT) {
// Pass custom isolation level on to EclipseLink's DatabaseLogin configuration.
@@ -581,11 +581,20 @@ class JpaTransactionManagerTests {
tt.setIsolationLevel(TransactionDefinition.ISOLATION_SERIALIZABLE);
assertThatExceptionOfType(InvalidIsolationLevelException.class).isThrownBy(() ->
tt.executeWithoutResult(status -> {}));
tt.executeWithoutResult(status -> {}));
verify(manager).close();
}
@Test
void testTransactionTimeout() {
tt.setTimeout(1000);
tt.executeWithoutResult(status -> {});
verify(tx).setTimeout(1000);
verify(manager).close();
}
@Test
void testTransactionFlush() {
assertThat(TransactionSynchronizationManager.hasResource(factory)).isFalse();