Skip to content

Commit 00f0c68

Browse files
committed
HHH-19551 - Address deficiencies in pessimistic locking
1 parent 1fa7935 commit 00f0c68

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+775
-601
lines changed

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

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import org.hibernate.dialect.NationalizationSupport;
2424
import org.hibernate.dialect.NullOrdering;
2525
import org.hibernate.dialect.PostgreSQLDriverKind;
26-
import org.hibernate.dialect.RowLockStrategy;
2726
import org.hibernate.dialect.SimpleDatabaseVersion;
2827
import org.hibernate.dialect.SpannerDialect;
2928
import org.hibernate.dialect.TimeZoneSupport;
@@ -34,7 +33,6 @@
3433
import org.hibernate.dialect.function.PostgreSQLTruncFunction;
3534
import org.hibernate.dialect.identity.CockroachDBIdentityColumnSupport;
3635
import org.hibernate.dialect.identity.IdentityColumnSupport;
37-
import org.hibernate.dialect.lock.internal.LockingSupportSimple;
3836
import org.hibernate.dialect.lock.spi.LockingSupport;
3937
import org.hibernate.dialect.pagination.LimitHandler;
4038
import org.hibernate.dialect.pagination.OffsetFetchLimitHandler;
@@ -98,6 +96,8 @@
9896
import java.util.regex.Matcher;
9997
import java.util.regex.Pattern;
10098

99+
import static org.hibernate.dialect.lock.internal.CockroachLockingSupport.COCKROACH_LOCKING_SUPPORT;
100+
import static org.hibernate.dialect.lock.internal.CockroachLockingSupport.LEGACY_COCKROACH_LOCKING_SUPPORT;
101101
import static org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtractor.extractUsingTemplate;
102102
import static org.hibernate.query.common.TemporalUnit.DAY;
103103
import static org.hibernate.query.common.TemporalUnit.EPOCH;
@@ -1087,7 +1087,9 @@ public String getForUpdateSkipLockedString(String aliases) {
10871087

10881088
@Override
10891089
public LockingSupport getLockingSupport() {
1090-
return LockingSupportSimple.NO_OUTER_JOIN;
1090+
return getVersion().isSameOrAfter( 20, 1 )
1091+
? COCKROACH_LOCKING_SUPPORT
1092+
: LEGACY_COCKROACH_LOCKING_SUPPORT;
10911093
}
10921094

10931095
@Override
@@ -1115,32 +1117,11 @@ public boolean supportsLateral() {
11151117
return getVersion().isSameOrAfter( 20, 1 );
11161118
}
11171119

1118-
@Override
1119-
public boolean supportsNoWait() {
1120-
return getVersion().isSameOrAfter( 20, 1 );
1121-
}
1122-
1123-
@Override
1124-
public boolean supportsWait() {
1125-
return false;
1126-
}
1127-
1128-
@Override
1129-
public boolean supportsSkipLocked() {
1130-
// See https://www.cockroachlabs.com/docs/stable/select-for-update.html#wait-policies
1131-
return false;
1132-
}
1133-
11341120
@Override
11351121
public FunctionalDependencyAnalysisSupport getFunctionalDependencyAnalysisSupport() {
11361122
return FunctionalDependencyAnalysisSupportImpl.TABLE_REFERENCE;
11371123
}
11381124

1139-
@Override
1140-
public RowLockStrategy getWriteRowLockStrategy() {
1141-
return getVersion().isSameOrAfter( 20, 1 ) ? RowLockStrategy.TABLE : RowLockStrategy.NONE;
1142-
}
1143-
11441125
@Override
11451126
public NameQualifierSupport getNameQualifierSupport() {
11461127
// This method is overridden so the correct value will be returned when

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

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import org.hibernate.dialect.function.TrimFunction;
2828
import org.hibernate.dialect.identity.DB2IdentityColumnSupport;
2929
import org.hibernate.dialect.identity.IdentityColumnSupport;
30-
import org.hibernate.dialect.lock.internal.NoLockingSupport;
30+
import org.hibernate.dialect.lock.internal.DB2LockingSupport;
3131
import org.hibernate.dialect.lock.spi.LockingSupport;
3232
import org.hibernate.dialect.pagination.DB2LimitHandler;
3333
import org.hibernate.dialect.pagination.LegacyDB2LimitHandler;
@@ -173,16 +173,26 @@ protected void applyAggregateColumnCheck(StringBuilder buf, AggregateColumn aggr
173173
}
174174
};
175175

176+
private LockingSupport lockingSupport;
177+
176178
public DB2LegacyDialect() {
177179
this( DatabaseVersion.make( 9, 0 ) );
178180
}
179181

180182
public DB2LegacyDialect(DialectResolutionInfo info) {
181183
super( info );
184+
lockingSupport = buildLockingSupport();
182185
}
183186

184187
public DB2LegacyDialect(DatabaseVersion version) {
185188
super( version );
189+
lockingSupport = buildLockingSupport();
190+
}
191+
192+
protected LockingSupport buildLockingSupport() {
193+
// Introduced in 11.5: https://www.ibm.com/docs/en/db2/11.5?topic=statement-concurrent-access-resolution-clause
194+
final boolean supportsSkipLocked = getVersion().isSameOrAfter( 11, 5 );
195+
return DB2LockingSupport.forDB2( supportsSkipLocked );
186196
}
187197

188198
@Override
@@ -766,9 +776,8 @@ public String getForUpdateString() {
766776
}
767777

768778
@Override
769-
public boolean supportsSkipLocked() {
770-
// Introduced in 11.5: https://www.ibm.com/docs/en/db2/11.5?topic=statement-concurrent-access-resolution-clause
771-
return getDB2Version().isSameOrAfter( 11, 5 );
779+
public LockingSupport getLockingSupport() {
780+
return lockingSupport;
772781
}
773782

774783
@Override
@@ -811,11 +820,6 @@ public String getReadLockString(int timeout) {
811820
: FOR_SHARE_SQL;
812821
}
813822

814-
@Override
815-
public LockingSupport getLockingSupport() {
816-
return NoLockingSupport.NO_LOCKING_SUPPORT;
817-
}
818-
819823
@Override
820824
public boolean supportsExistsInSelect() {
821825
return false;

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import org.hibernate.dialect.identity.DB2IdentityColumnSupport;
1111
import org.hibernate.dialect.identity.DB2zIdentityColumnSupport;
1212
import org.hibernate.dialect.identity.IdentityColumnSupport;
13+
import org.hibernate.dialect.lock.internal.DB2LockingSupport;
14+
import org.hibernate.dialect.lock.spi.LockingSupport;
1315
import org.hibernate.dialect.pagination.FetchLimitHandler;
1416
import org.hibernate.dialect.pagination.LegacyDB2LimitHandler;
1517
import org.hibernate.dialect.pagination.LimitHandler;
@@ -55,6 +57,11 @@ public DB2iLegacyDialect(DatabaseVersion version) {
5557
super(version);
5658
}
5759

60+
@Override
61+
protected LockingSupport buildLockingSupport() {
62+
return DB2LockingSupport.forDB2i();
63+
}
64+
5865
@Override
5966
public void initializeFunctionRegistry(FunctionContributions functionContributions) {
6067
super.initializeFunctionRegistry(functionContributions);
@@ -132,11 +139,6 @@ public IdentityColumnSupport getIdentityColumnSupport() {
132139
: DB2zIdentityColumnSupport.INSTANCE;
133140
}
134141

135-
@Override
136-
public boolean supportsSkipLocked() {
137-
return true;
138-
}
139-
140142
@Override
141143
public boolean supportsLateral() {
142144
return getVersion().isSameOrAfter( 7, 1 );

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import org.hibernate.dialect.function.CommonFunctionFactory;
1212
import org.hibernate.dialect.identity.DB2zIdentityColumnSupport;
1313
import org.hibernate.dialect.identity.IdentityColumnSupport;
14+
import org.hibernate.dialect.lock.internal.DB2LockingSupport;
15+
import org.hibernate.dialect.lock.spi.LockingSupport;
1416
import org.hibernate.dialect.pagination.FetchLimitHandler;
1517
import org.hibernate.dialect.pagination.LimitHandler;
1618
import org.hibernate.dialect.pagination.OffsetFetchLimitHandler;
@@ -63,6 +65,11 @@ public DB2zLegacyDialect(DatabaseVersion version) {
6365
super(version);
6466
}
6567

68+
@Override
69+
protected LockingSupport buildLockingSupport() {
70+
return DB2LockingSupport.forDB2z();
71+
}
72+
6673
@Override
6774
public void initializeFunctionRegistry(FunctionContributions functionContributions) {
6875
super.initializeFunctionRegistry(functionContributions);
@@ -149,11 +156,6 @@ public IdentityColumnSupport getIdentityColumnSupport() {
149156
return DB2zIdentityColumnSupport.INSTANCE;
150157
}
151158

152-
@Override
153-
public boolean supportsSkipLocked() {
154-
return true;
155-
}
156-
157159
@Override
158160
public boolean supportsLateral() {
159161
return true;

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

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -582,11 +582,6 @@ protected LockingClauseStrategy buildLockingClauseStrategy(PessimisticLockKind l
582582
return new DerbyLockingClauseStrategy( this, lockKind, rowLockStrategy, lockScope, timeout );
583583
}
584584

585-
@Override
586-
public RowLockStrategy getReadRowLockStrategy() {
587-
return RowLockStrategy.NONE;
588-
}
589-
590585
@Override
591586
public String getForUpdateString() {
592587
return " for update with rs";

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

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import org.hibernate.dialect.HANAServerConfiguration;
2222
import org.hibernate.dialect.NullOrdering;
2323
import org.hibernate.dialect.OracleDialect;
24-
import org.hibernate.dialect.RowLockStrategy;
2524
import org.hibernate.dialect.aggregate.AggregateSupport;
2625
import org.hibernate.dialect.aggregate.HANAAggregateSupport;
2726
import org.hibernate.dialect.function.CommonFunctionFactory;
@@ -180,6 +179,8 @@ public class HANALegacyDialect extends Dialect {
180179

181180
static final DatabaseVersion DEFAULT_VERSION = DatabaseVersion.make( 1, 0, 120 );
182181

182+
private final LockingSupport lockingSupport;
183+
183184
public HANALegacyDialect(DialectResolutionInfo info) {
184185
this( HANAServerConfiguration.fromDialectResolutionInfo( info ), true );
185186
registerKeywords( info );
@@ -202,8 +203,17 @@ public HANALegacyDialect(HANAServerConfiguration configuration, boolean defaultT
202203
this.defaultTableTypeColumn = defaultTableTypeColumn;
203204
this.maxLobPrefetchSize = configuration.getMaxLobPrefetchSize();
204205
this.useUnicodeStringTypes = useUnicodeStringTypesDefault();
206+
207+
this.lockingSupport = buildLockingSupport();
208+
}
209+
210+
private LockingSupport buildLockingSupport() {
211+
// HANA supports IGNORE LOCKED since HANA 2.0 SPS3 (2.0.030)
212+
final boolean supportsSkipLocked = getVersion().isSameOrAfter(2, 0, 30);
213+
return new HANALockingSupport( supportsSkipLocked );
205214
}
206215

216+
207217
@Override
208218
public DatabaseVersion determineDatabaseVersion(DialectResolutionInfo info) {
209219
return HANALegacyServerConfiguration.staticDetermineDatabaseVersion( info );
@@ -641,12 +651,7 @@ public SQLExceptionConversionDelegate buildSQLExceptionConversionDelegate() {
641651

642652
@Override
643653
public LockingSupport getLockingSupport() {
644-
return HANALockingSupport.LOCKING_SUPPORT;
645-
}
646-
647-
@Override
648-
public RowLockStrategy getWriteRowLockStrategy() {
649-
return RowLockStrategy.COLUMN;
654+
return HANALockingSupport.HANA_LOCKING_SUPPORT;
650655
}
651656

652657
@Override
@@ -1189,11 +1194,6 @@ public boolean supportsLateral() {
11891194
return getVersion().isSameOrAfter( 2, 0, 40 );
11901195
}
11911196

1192-
@Override
1193-
public boolean supportsNoWait() {
1194-
return true;
1195-
}
1196-
11971197
@Override
11981198
public boolean supportsJdbcConnectionLobCreation(DatabaseMetaData databaseMetaData) {
11991199
return false;
@@ -2016,12 +2016,6 @@ public DmlTargetColumnQualifierSupport getDmlTargetColumnQualifierSupport() {
20162016
return DmlTargetColumnQualifierSupport.TABLE_ALIAS;
20172017
}
20182018

2019-
@Override
2020-
public boolean supportsSkipLocked() {
2021-
// HANA supports IGNORE LOCKED since HANA 2.0 SPS3 (2.0.030)
2022-
return getVersion().isSameOrAfter(2, 0, 30);
2023-
}
2024-
20252019
@Override
20262020
public String getForUpdateSkipLockedString() {
20272021
return supportsSkipLocked() ? getForUpdateString() + SQL_IGNORE_LOCKED : getForUpdateString();

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

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import org.hibernate.dialect.aggregate.AggregateSupportImpl;
1515
import org.hibernate.dialect.aggregate.MySQLAggregateSupport;
1616
import org.hibernate.dialect.function.CommonFunctionFactory;
17+
import org.hibernate.dialect.lock.internal.MariaDBLockingSupport;
18+
import org.hibernate.dialect.lock.spi.LockingSupport;
1719
import org.hibernate.dialect.sequence.MariaDBSequenceSupport;
1820
import org.hibernate.dialect.sequence.SequenceSupport;
1921
import org.hibernate.dialect.type.MariaDBCastingJsonArrayJdbcTypeConstructor;
@@ -69,6 +71,10 @@ public MariaDBLegacyDialect(DialectResolutionInfo info) {
6971
registerKeywords( info );
7072
}
7173

74+
protected LockingSupport buildLockingSupport() {
75+
return new MariaDBLockingSupport( getVersion() );
76+
}
77+
7278
@Override
7379
public DatabaseVersion getMySQLVersion() {
7480
return getVersion().isBefore( 5, 3 )
@@ -252,22 +258,6 @@ public SequenceInformationExtractor getSequenceInformationExtractor() {
252258
: super.getSequenceInformationExtractor();
253259
}
254260

255-
@Override
256-
public boolean supportsSkipLocked() {
257-
//only supported on MySQL and as of 10.6
258-
return getVersion().isSameOrAfter( 10, 6 );
259-
}
260-
261-
@Override
262-
public boolean supportsNoWait() {
263-
return getVersion().isSameOrAfter( 10, 3 );
264-
}
265-
266-
@Override
267-
public boolean supportsWait() {
268-
return getVersion().isSameOrAfter( 10, 3 );
269-
}
270-
271261
@Override
272262
boolean supportsForShare() {
273263
//only supported on MySQL

0 commit comments

Comments
 (0)