Skip to content

Commit 692ad50

Browse files
committed
HHH-19336 - Proper implementation for JPA extended locking scope
HHH-19459 - LockScope, FollowOnLocking
1 parent 143ae86 commit 692ad50

17 files changed

+219
-414
lines changed

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/CacheDialect.java

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,8 @@
44
*/
55
package org.hibernate.community.dialect;
66

7-
import java.sql.CallableStatement;
8-
import java.sql.ResultSet;
9-
import java.sql.SQLException;
10-
import java.sql.Types;
11-
7+
import jakarta.persistence.GenerationType;
8+
import jakarta.persistence.TemporalType;
129
import org.hibernate.LockMode;
1310
import org.hibernate.LockOptions;
1411
import org.hibernate.boot.model.FunctionContributions;
@@ -40,12 +37,11 @@
4037
import org.hibernate.exception.spi.ViolatedConstraintNameExtractor;
4138
import org.hibernate.internal.util.JdbcExceptionHelper;
4239
import org.hibernate.persister.entity.EntityPersister;
43-
import org.hibernate.query.sqm.IntervalType;
4440
import org.hibernate.query.common.TemporalUnit;
41+
import org.hibernate.query.sqm.IntervalType;
4542
import org.hibernate.sql.ast.SqlAstTranslator;
4643
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
47-
import org.hibernate.sql.ast.internal.NoOpForUpdateClauseStrategy;
48-
import org.hibernate.sql.ast.spi.ForUpdateClauseStrategy;
44+
import org.hibernate.sql.ast.spi.LockingClauseStrategy;
4945
import org.hibernate.sql.ast.spi.SqlAppender;
5046
import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory;
5147
import org.hibernate.sql.ast.tree.Statement;
@@ -55,12 +51,15 @@
5551
import org.hibernate.type.descriptor.jdbc.JdbcType;
5652
import org.hibernate.type.descriptor.jdbc.spi.JdbcTypeRegistry;
5753

58-
import jakarta.persistence.GenerationType;
59-
import jakarta.persistence.TemporalType;
54+
import java.sql.CallableStatement;
55+
import java.sql.ResultSet;
56+
import java.sql.SQLException;
57+
import java.sql.Types;
6058

6159
import static org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtractor.extractUsingTemplate;
6260
import static org.hibernate.query.sqm.produce.function.FunctionParameterType.INTEGER;
6361
import static org.hibernate.query.sqm.produce.function.FunctionParameterType.STRING;
62+
import static org.hibernate.sql.ast.internal.NonLockingClauseStrategy.NON_CLAUSE_STRATEGY;
6463
import static org.hibernate.type.SqlTypes.BLOB;
6564
import static org.hibernate.type.SqlTypes.BOOLEAN;
6665
import static org.hibernate.type.SqlTypes.CLOB;
@@ -314,8 +313,8 @@ public String getQuerySequencesString() {
314313
// lock acquisition support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
315314

316315
@Override
317-
public ForUpdateClauseStrategy getForUpdateClauseStrategy(QuerySpec querySpec, LockOptions lockOptions) {
318-
return NoOpForUpdateClauseStrategy.NO_OP_STRATEGY;
316+
public LockingClauseStrategy getLockingClauseStrategy(QuerySpec querySpec, LockOptions lockOptions) {
317+
return NON_CLAUSE_STRATEGY;
319318
}
320319

321320
@Override

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DerbyDialect.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import java.util.Locale;
1111

1212
import jakarta.persistence.Timeout;
13-
import org.hibernate.LockOptions;
13+
import org.hibernate.Locking;
1414
import org.hibernate.boot.model.FunctionContributions;
1515
import org.hibernate.boot.model.TypeContributions;
1616
import org.hibernate.dialect.DB2Dialect;
@@ -63,11 +63,11 @@
6363
import org.hibernate.sql.ast.SqlAstNodeRenderingMode;
6464
import org.hibernate.sql.ast.SqlAstTranslator;
6565
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
66-
import org.hibernate.sql.ast.spi.ForUpdateClauseStrategy;
66+
import org.hibernate.sql.ast.internal.PessimisticLockKind;
67+
import org.hibernate.sql.ast.spi.LockingClauseStrategy;
6768
import org.hibernate.sql.ast.spi.SqlAppender;
6869
import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory;
6970
import org.hibernate.sql.ast.tree.Statement;
70-
import org.hibernate.sql.ast.tree.select.QuerySpec;
7171
import org.hibernate.sql.exec.spi.JdbcOperation;
7272
import org.hibernate.community.dialect.sequence.SequenceInformationExtractorDerbyDatabaseImpl;
7373
import org.hibernate.tool.schema.extract.spi.SequenceInformationExtractor;
@@ -572,8 +572,8 @@ public boolean supportsCommentOn() {
572572
}
573573

574574
@Override
575-
public ForUpdateClauseStrategy getForUpdateClauseStrategy(QuerySpec querySpec, LockOptions lockOptions) {
576-
return DerbyForUpdateStrategy.strategy( this, querySpec, lockOptions );
575+
protected LockingClauseStrategy buildLockingClauseStrategy(PessimisticLockKind lockKind, RowLockStrategy rowLockStrategy, Locking.Scope lockScope, int timeout) {
576+
return new DerbyLockingClauseStrategy( this, lockKind, rowLockStrategy, lockScope, timeout );
577577
}
578578

579579
@Override

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DerbyForUpdateStrategy.java

Lines changed: 0 additions & 54 deletions
This file was deleted.

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DerbyLegacyDialect.java

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import java.sql.Types;
1010

1111
import jakarta.persistence.Timeout;
12-
import org.hibernate.LockOptions;
12+
import org.hibernate.Locking;
1313
import org.hibernate.boot.model.FunctionContributions;
1414
import org.hibernate.boot.model.TypeContributions;
1515
import org.hibernate.dialect.DB2Dialect;
@@ -61,11 +61,11 @@
6161
import org.hibernate.sql.ast.SqlAstNodeRenderingMode;
6262
import org.hibernate.sql.ast.SqlAstTranslator;
6363
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
64-
import org.hibernate.sql.ast.spi.ForUpdateClauseStrategy;
64+
import org.hibernate.sql.ast.internal.PessimisticLockKind;
65+
import org.hibernate.sql.ast.spi.LockingClauseStrategy;
6566
import org.hibernate.sql.ast.spi.SqlAppender;
6667
import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory;
6768
import org.hibernate.sql.ast.tree.Statement;
68-
import org.hibernate.sql.ast.tree.select.QuerySpec;
6969
import org.hibernate.sql.exec.spi.JdbcOperation;
7070
import org.hibernate.community.dialect.sequence.SequenceInformationExtractorDerbyDatabaseImpl;
7171
import org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorNoOpImpl;
@@ -583,18 +583,8 @@ public boolean supportsCommentOn() {
583583
}
584584

585585
@Override
586-
public ForUpdateClauseStrategy getForUpdateClauseStrategy(QuerySpec querySpec, LockOptions lockOptions) {
587-
return DerbyForUpdateStrategy.strategy( this, querySpec, lockOptions );
588-
}
589-
590-
@Override
591-
public RowLockStrategy getWriteRowLockStrategy() {
592-
return RowLockStrategy.NONE;
593-
}
594-
595-
@Override
596-
public RowLockStrategy getReadRowLockStrategy() {
597-
return RowLockStrategy.NONE;
586+
protected LockingClauseStrategy buildLockingClauseStrategy(PessimisticLockKind lockKind, RowLockStrategy rowLockStrategy, Locking.Scope lockScope, int timeout) {
587+
return new DerbyLockingClauseStrategy( this, lockKind, rowLockStrategy, lockScope, timeout );
598588
}
599589

600590
@Override
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.community.dialect;
6+
7+
import org.hibernate.Locking;
8+
import org.hibernate.dialect.Dialect;
9+
import org.hibernate.dialect.RowLockStrategy;
10+
import org.hibernate.sql.ast.internal.PessimisticLockKind;
11+
import org.hibernate.sql.ast.internal.StandardLockingClauseStrategy;
12+
import org.hibernate.sql.ast.spi.SqlAppender;
13+
14+
/**
15+
* StandardLockingClauseStrategy subclass, specific for Derby.
16+
*
17+
* @author Steve Ebersole
18+
*/
19+
public class DerbyLockingClauseStrategy extends StandardLockingClauseStrategy {
20+
public DerbyLockingClauseStrategy(
21+
Dialect dialect,
22+
PessimisticLockKind lockKind,
23+
RowLockStrategy rowLockStrategy,
24+
Locking.Scope lockingScope,
25+
int timeout) {
26+
super( dialect, lockKind, rowLockStrategy, lockingScope, timeout );
27+
}
28+
29+
@Override
30+
protected void renderResultSetOptions(SqlAppender sqlAppender) {
31+
sqlAppender.append( " with rs" );
32+
}
33+
}

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/IngresDialect.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
*/
55
package org.hibernate.community.dialect;
66

7-
import java.sql.Types;
8-
7+
import jakarta.persistence.TemporalType;
98
import org.hibernate.LockOptions;
109
import org.hibernate.boot.model.FunctionContributions;
1110
import org.hibernate.community.dialect.identity.Ingres10IdentityColumnSupport;
@@ -29,11 +28,11 @@
2928
import org.hibernate.engine.spi.SessionFactoryImplementor;
3029
import org.hibernate.metamodel.mapping.EntityMappingType;
3130
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
31+
import org.hibernate.query.common.FetchClauseType;
32+
import org.hibernate.query.common.TemporalUnit;
3233
import org.hibernate.query.spi.QueryOptions;
3334
import org.hibernate.query.spi.QueryParameterBindings;
34-
import org.hibernate.query.common.FetchClauseType;
3535
import org.hibernate.query.sqm.IntervalType;
36-
import org.hibernate.query.common.TemporalUnit;
3736
import org.hibernate.query.sqm.internal.DomainParameterXref;
3837
import org.hibernate.query.sqm.mutation.internal.temptable.GlobalTemporaryTableInsertStrategy;
3938
import org.hibernate.query.sqm.mutation.internal.temptable.GlobalTemporaryTableMutationStrategy;
@@ -45,8 +44,7 @@
4544
import org.hibernate.query.sqm.tree.select.SqmSelectStatement;
4645
import org.hibernate.sql.ast.SqlAstTranslator;
4746
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
48-
import org.hibernate.sql.ast.internal.NoOpForUpdateClauseStrategy;
49-
import org.hibernate.sql.ast.spi.ForUpdateClauseStrategy;
47+
import org.hibernate.sql.ast.spi.LockingClauseStrategy;
5048
import org.hibernate.sql.ast.spi.SqlAppender;
5149
import org.hibernate.sql.ast.spi.SqlAstCreationContext;
5250
import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory;
@@ -62,10 +60,11 @@
6260
import org.hibernate.type.descriptor.jdbc.JdbcType;
6361
import org.hibernate.type.descriptor.jdbc.spi.JdbcTypeRegistry;
6462

65-
import jakarta.persistence.TemporalType;
63+
import java.sql.Types;
6664

6765
import static org.hibernate.query.sqm.produce.function.FunctionParameterType.INTEGER;
6866
import static org.hibernate.query.sqm.produce.function.FunctionParameterType.STRING;
67+
import static org.hibernate.sql.ast.internal.NonLockingClauseStrategy.NON_CLAUSE_STRATEGY;
6968
import static org.hibernate.type.SqlTypes.BINARY;
7069
import static org.hibernate.type.SqlTypes.BLOB;
7170
import static org.hibernate.type.SqlTypes.BOOLEAN;
@@ -416,9 +415,9 @@ else if ( getVersion().isSameOrAfter( 9, 3 ) ) {
416415
// lock acquisition support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
417416

418417
@Override
419-
public ForUpdateClauseStrategy getForUpdateClauseStrategy(QuerySpec querySpec, LockOptions lockOptions) {
418+
public LockingClauseStrategy getLockingClauseStrategy(QuerySpec querySpec, LockOptions lockOptions) {
420419
// Ingres does not support the FOR UPDATE clause
421-
return NoOpForUpdateClauseStrategy.NO_OP_STRATEGY;
420+
return NON_CLAUSE_STRATEGY;
422421
}
423422

424423
/**

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/RDMSOS2200Dialect.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@
44
*/
55
package org.hibernate.community.dialect;
66

7-
import java.lang.invoke.MethodHandles;
8-
import java.sql.Types;
9-
7+
import jakarta.persistence.TemporalType;
108
import org.hibernate.LockMode;
119
import org.hibernate.LockOptions;
1210
import org.hibernate.boot.model.FunctionContributions;
@@ -32,26 +30,26 @@
3230
import org.hibernate.engine.spi.SessionFactoryImplementor;
3331
import org.hibernate.internal.CoreMessageLogger;
3432
import org.hibernate.persister.entity.EntityPersister;
35-
import org.hibernate.query.sqm.IntervalType;
3633
import org.hibernate.query.common.TemporalUnit;
34+
import org.hibernate.query.sqm.IntervalType;
3735
import org.hibernate.query.sqm.TrimSpec;
3836
import org.hibernate.sql.ast.SqlAstTranslator;
3937
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
40-
import org.hibernate.sql.ast.internal.NoOpForUpdateClauseStrategy;
41-
import org.hibernate.sql.ast.spi.ForUpdateClauseStrategy;
38+
import org.hibernate.sql.ast.spi.LockingClauseStrategy;
4239
import org.hibernate.sql.ast.spi.SqlAppender;
4340
import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory;
4441
import org.hibernate.sql.ast.tree.Statement;
4542
import org.hibernate.sql.ast.tree.select.QuerySpec;
4643
import org.hibernate.sql.exec.spi.JdbcOperation;
4744
import org.hibernate.type.descriptor.jdbc.JdbcType;
4845
import org.hibernate.type.descriptor.jdbc.spi.JdbcTypeRegistry;
49-
5046
import org.jboss.logging.Logger;
5147

52-
import jakarta.persistence.TemporalType;
48+
import java.lang.invoke.MethodHandles;
49+
import java.sql.Types;
5350

5451
import static org.hibernate.dialect.SimpleDatabaseVersion.ZERO_VERSION;
52+
import static org.hibernate.sql.ast.internal.NonLockingClauseStrategy.NON_CLAUSE_STRATEGY;
5553
import static org.hibernate.type.SqlTypes.BIGINT;
5654
import static org.hibernate.type.SqlTypes.BINARY;
5755
import static org.hibernate.type.SqlTypes.BLOB;
@@ -419,9 +417,9 @@ public LockingStrategy getLockingStrategy(EntityPersister lockable, LockMode loc
419417
}
420418

421419
@Override
422-
public ForUpdateClauseStrategy getForUpdateClauseStrategy(QuerySpec querySpec, LockOptions lockOptions) {
420+
public LockingClauseStrategy getLockingClauseStrategy(QuerySpec querySpec, LockOptions lockOptions) {
423421
// Unisys 2200 does not support the FOR UPDATE clause
424-
return NoOpForUpdateClauseStrategy.NO_OP_STRATEGY;
422+
return NON_CLAUSE_STRATEGY;
425423
}
426424

427425
@Override

0 commit comments

Comments
 (0)