Skip to content

Commit

Permalink
HHH-17421 Test that no follow-on locking happens on SQL Server and Sy…
Browse files Browse the repository at this point in the history
…base ASE
  • Loading branch information
SimonStJG authored and beikov committed May 7, 2024
1 parent e842669 commit e18bf7b
Showing 1 changed file with 88 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -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();
} );
}
}

0 comments on commit e18bf7b

Please sign in to comment.