10000 Adventures in locking · hibernate/hibernate-orm@461a258 · GitHub
[go: up one dir, main page]

Skip to content

Commit 461a258

Browse files
committed
Adventures in locking
1 parent 6ebfb9f commit 461a258

File tree

2 files changed

+38
-16
lines changed

2 files changed

+38
-16
lines changed

hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import java.sql.ResultSet;
1111
import java.sql.SQLException;
1212
import java.sql.Types;
13-
import java.util.Map;
1413
import java.util.Properties;
1514
import java.util.function.BiConsumer;
1615

@@ -46,6 +45,7 @@
4645
import org.hibernate.mapping.PrimaryKey;
4746
import org.hibernate.mapping.Table;
4847
import org.hibernate.service.ServiceRegistry;
48+
import org.hibernate.sql.SimpleSelect;
4949
import org.hibernate.stat.spi.StatisticsImplementor;
5050
import org.hibernate.type.BasicType;
5151
import org.hibernate.type.BasicTypeRegistry;
@@ -55,7 +55,6 @@
5555
import org.hibernate.type.descriptor.sql.spi.DdlTypeRegistry;
5656
import org.jboss.logging.Logger;
5757

58-
import static java.util.Collections.singletonMap;
5958
import static org.hibernate.boot.model.internal.GeneratorBinder.applyIfNotEmpty;
6059
import static org.hibernate.id.IdentifierGeneratorHelper.getNamingStrategy;
6160
import static org.hibernate.id.enhanced.OptimizerFactory.determineImplicitOptimizerName;
@@ -493,14 +492,14 @@ protected int determineIncrementSize(Properties params) {
493492
}
494493

495494
protected String buildSelectQuery(String formattedPhysicalTableName, SqlStringGenerationContext context) {
496-
final String alias = "tbl";
497-
final String query = "select " + qualify( alias, valueColumnName )
498-
+ " from " + formattedPhysicalTableName + ' ' + alias
499-
+ " where " + qualify( alias, segmentColumnName ) + "=?";
500495
final LockOptions lockOptions = new LockOptions( LockMode.PESSIMISTIC_WRITE );
501-
lockOptions.setAliasSpecificLockMode( alias, LockMode.PESSIMISTIC_WRITE );
502-
final Map<String,String[]> updateTargetColumnsMap = singletonMap( alias, new String[] { valueColumnName } );
503-
return context.getDialect().applyLocksToSql( query, lockOptions, updateTargetColumnsMap );
496+
final String alias = "tbl";
497+
final SimpleSelect select = new SimpleSelect( context.getDialect() )
498+
.addColumn( qualify( alias, valueColumnName ) )
499+
.setTableName( formattedPhysicalTableName, alias )
500+
.addRestriction( qualify( alias, segmentColumnName ) )
501+
.setLockOptions( lockOptions );
502+
return select.toStatementString();
504503
}
505504

506505
protected String buildUpdateQuery(String formattedPhysicalTableName, SqlStringGenerationContext context) {

hibernate-core/src/main/java/org/hibernate/sql/SimpleSelect.java

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,23 @@
44
*/
55
package org.hibernate.sql;
66

7-
import java.util.ArrayList;
8-
import java.util.HashMap;
9-
import java.util.HashSet;
10-
import java.util.List;
11-
import java.util.Map;
12-
import java.util.Set;
13-
147
import org.hibernate.Internal;
158
import org.hibernate.LockMode;
169
import org.hibernate.LockOptions;
1710
import org.hibernate.dialect.Dialect;
1811
import org.hibernate.engine.jdbc.spi.JdbcServices;
1912
import org.hibernate.engine.spi.SessionFactoryImplementor;
13+
import org.hibernate.internal.util.StringHelper;
14+
import org.hibernate.sql.ast.internal.ParameterMarkerStrategyStandard;
2015
import org.hibernate.sql.ast.spi.ParameterMarkerStrategy;
2116

17+
import java.util.ArrayList;
18+
import java.util.HashMap;
19+
import java.util.HashSet;
20+
import java.util.List;
21+
import java.util.Map;
22+
import java.util.Set;
23+
2224
/**
2325
* A SQL {@code SELECT} statement with no table joins.
2426
*
@@ -27,6 +29,7 @@
2729
@Internal
2830
public class SimpleSelect implements RestrictionRenderingContext {
2931
protected String tableName;
32+
protected String tableAlias;
3033
protected String orderBy;
3134
protected String comment;
3235

@@ -46,6 +49,15 @@ public SimpleSelect(final SessionFactoryImplementor factory) {
4649
this.parameterMarkerStrategy = jdbcServices.getParameterMarkerStrategy();
4750
}
4851

52+
public SimpleSelect(Dialect dialect) {
53+
this( dialect, dialect.getNativeParameterMarkerStrategy() );
54+
}
55+
56+
public SimpleSelect(Dialect dialect, ParameterMarkerStrategy parameterMarkerStrategy) {
57+
this.dialect = dialect;
58+
this.parameterMarkerStrategy = parameterMarkerStrategy;
59+
}
60+
4961
@Override
5062
public String makeParameterMarker() {
5163
return parameterMarkerStrategy.createMarker( ++parameterCount, null );
@@ -55,7 +67,15 @@ public String makeParameterMarker() {
5567
* Sets the name of the table we are selecting from
5668
*/
5769
public SimpleSelect setTableName(String tableName) {
70+
return setTableName( tableName, null );
71+
}
72+
73+
/**
74+
* Sets the name of the table we are selecting from
75+
*/
76+
public SimpleSelect setTableName(String tableName, String tableAlias) {
5877
this.tableName = tableName;
78+
this.tableAlias = tableAlias;
5979
return this;
6080
}
6181

@@ -205,6 +225,9 @@ private void applySelectClause(StringBuilder buf) {
205225

206226
private void applyFromClause(StringBuilder buf) {
207227
buf.append( " from " ).append( dialect.appendLockHint( lockOptions, tableName ) );
228+
if ( StringHelper.isNotEmpty( tableAlias ) ) {
229+
buf.append( " as " ).append( tableAlias );
230+
}
208231
}
209232

210233
private void applyWhereClause(StringBuilder buf) {

0 commit comments

Comments
 (0)
0