mirror of
https://github.com/spring-projects/spring-framework
synced 2026-06-08 17:33:33 +00:00
Consistent support for JPA 3.2 transaction timeout
Closes gh-35663
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
+4
@@ -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.
|
||||
|
||||
+10
-1
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user