HHH-17421 Test that no follow-on locking happens on SQL Server and Sybase ASE

This commit is contained in:
Simon StJohn-Green 2023-11-14 10:13:15 +00:00 committed by Christian Beikov
parent e8426692e4
commit e18bf7b6b4
1 changed files with 88 additions and 0 deletions

View File

@ -0,0 +1,88 @@
package org.hibernate.orm.test.locking.jpa;
import org.hibernate.dialect.SQLServerDialect;
import org.hibernate.dialect.SybaseASEDialect;
import org.hibernate.query.spi.QueryImplementor;
import org.hibernate.testing.jdbc.SQLStatementInspector;
import org.hibernate.testing.orm.junit.DomainModel;
import org.hibernate.testing.orm.junit.JiraKey;
import org.hibernate.testing.orm.junit.RequiresDialect;
import org.hibernate.testing.orm.junit.SessionFactory;
import org.hibernate.testing.orm.junit.SessionFactoryScope;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import jakarta.persistence.LockModeType;
import jakarta.persistence.Tuple;
@DomainModel(annotatedClasses = { Department.class })
@SessionFactory(useCollectingStatementInspector = true)
@RequiresDialect(value = SQLServerDialect.class)
@RequiresDialect(value = SybaseASEDialect.class)
public class AdvancedFollowOnLockingTest {
@Test
@JiraKey("HHH-17421")
public void testNoFollowonLocking(SessionFactoryScope scope) {
SQLStatementInspector statementInspector = scope.getCollectingStatementInspector();
scope.inTransaction(
session -> {
final Department engineering = new Department( 1, "Engineering" );
session.persist( engineering );
}
);
scope.inTransaction(
session -> {
statementInspector.clear();
final QueryImplementor<Department> query = session.createQuery(
"select distinct d from Department d",
Department.class
);
query.setLockMode( LockModeType.PESSIMISTIC_WRITE );
query.list();
// The only statement should be the initial SELECT .. WITH (UPDLOCK, ..) ..
// and without any follow-on locking.
statementInspector.assertExecutedCount( 1 );
}
);
}
@Test
@JiraKey("HHH-17421")
public void testNoFollowonLockingOnGroupBy(SessionFactoryScope scope) {
SQLStatementInspector statementInspector = scope.getCollectingStatementInspector();
scope.inTransaction( session -> {
final Department engineering = new Department( 1, "Engineering" );
session.persist( engineering );
}
);
scope.inTransaction(
session -> {
statementInspector.clear();
final QueryImplementor<Tuple> query = session.createQuery(
"select d, count(*) from Department d left join Department d2 on d.name = d2.name group by d",
Tuple.class
);
query.setLockMode( LockModeType.PESSIMISTIC_WRITE );
query.list();
// The only statement should be the initial SELECT .. WITH (UPDLOCK, ..) ..
// and without any follow-on locking.
statementInspector.assertExecutedCount( 1 );
}
);
}
@AfterEach
public void dropTestData(SessionFactoryScope scope) {
scope.inTransaction( (session) -> {
session.createMutationQuery( "delete Department" ).executeUpdate();
} );
}
}