Skip to content

Commit c063249

Browse files
committed
Consistent support for JPA 3.2 transaction timeout
Closes gh-35663
1 parent b261b74 commit c063249

3 files changed

Lines changed: 19 additions & 1 deletion

File tree

spring-orm/src/main/java/org/springframework/orm/jpa/DefaultJpaDialect.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,16 @@ public class DefaultJpaDialect implements JpaDialect, Serializable {
5959
public @Nullable Object beginTransaction(EntityManager entityManager, TransactionDefinition definition)
6060
throws PersistenceException, SQLException, TransactionException {
6161

62+
if (definition.getTimeout() != TransactionDefinition.TIMEOUT_DEFAULT) {
63+
entityManager.getTransaction().setTimeout(definition.getTimeout());
64+
}
65+
6266
if (definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT) {
6367
throw new InvalidIsolationLevelException(getClass().getSimpleName() +
6468
" does not support custom isolation levels due to limitations in standard JPA. " +
6569
"Specific arrangements may be implemented in custom JpaDialect variants.");
6670
}
71+
6772
entityManager.getTransaction().begin();
6873
return null;
6974
}

spring-orm/src/main/java/org/springframework/orm/jpa/vendor/EclipseLinkJpaDialect.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,10 @@ public void setLazyDatabaseTransaction(boolean lazyDatabaseTransaction) {
9999
public @Nullable Object beginTransaction(EntityManager entityManager, TransactionDefinition definition)
100100
throws PersistenceException, SQLException, TransactionException {
101101

102+
if (definition.getTimeout() != TransactionDefinition.TIMEOUT_DEFAULT) {
103+
entityManager.getTransaction().setTimeout(definition.getTimeout());
104+
}
105+
102106
int currentIsolationLevel = definition.getIsolationLevel();
103107
if (currentIsolationLevel != TransactionDefinition.ISOLATION_DEFAULT) {
104108
// Pass custom isolation level on to EclipseLink's DatabaseLogin configuration.

spring-orm/src/test/java/org/springframework/orm/jpa/JpaTransactionManagerTests.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -581,11 +581,20 @@ void testInvalidIsolation() {
581581
tt.setIsolationLevel(TransactionDefinition.ISOLATION_SERIALIZABLE);
582582

583583
assertThatExceptionOfType(InvalidIsolationLevelException.class).isThrownBy(() ->
584-
tt.executeWithoutResult(status -> {}));
584+
tt.executeWithoutResult(status -> {}));
585585

586586
verify(manager).close();
587587
}
588588

589+
@Test
590+
void testTransactionTimeout() {
591+
tt.setTimeout(1000);
592+
tt.executeWithoutResult(status -> {});
593+
594+
verify(tx).setTimeout(1000);
595+
verify(manager).close();
596+
}
597+
589598
@Test
590599
void testTransactionFlush() {
591600
assertThat(TransactionSynchronizationManager.hasResource(factory)).isFalse();

0 commit comments

Comments
 (0)