diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/DB2iDialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/DB2iDialect.java index 3b0a9fcc12..e52bf22064 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/DB2iDialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/DB2iDialect.java @@ -6,6 +6,7 @@ */ package org.hibernate.dialect; +import org.hibernate.LockOptions; import org.hibernate.boot.model.FunctionContributions; import org.hibernate.dialect.function.CommonFunctionFactory; import org.hibernate.dialect.identity.DB2IdentityColumnSupport; @@ -41,6 +42,9 @@ public class DB2iDialect extends DB2Dialect { private final static DatabaseVersion MINIMUM_VERSION = DatabaseVersion.make( 7, 1 ); final static DatabaseVersion DB2_LUW_VERSION = DB2Dialect.MINIMUM_VERSION; + private static final String FOR_UPDATE_SQL = " for update with rs"; + private static final String FOR_UPDATE_SKIP_LOCKED_SQL = FOR_UPDATE_SQL + " skip locked data"; + public DB2iDialect(DialectResolutionInfo info) { this( info.makeCopyOrDefault( MINIMUM_VERSION ) ); registerKeywords( info ); @@ -124,6 +128,7 @@ public class DB2iDialect extends DB2Dialect { } } + @Override public LimitHandler getLimitHandler() { return getVersion().isSameOrAfter(7, 3) @@ -171,4 +176,35 @@ public class DB2iDialect extends DB2Dialect { public String getRowIdColumnString(String rowId) { return rowId( rowId ) + " rowid not null generated always"; } + + @Override + public String getForUpdateString() { + return FOR_UPDATE_SQL; + } + + @Override + public String getForUpdateSkipLockedString() { + return supportsSkipLocked() + ? FOR_UPDATE_SKIP_LOCKED_SQL + : FOR_UPDATE_SQL; + } + + @Override + public String getForUpdateSkipLockedString(String aliases) { + return getForUpdateSkipLockedString(); + } + + @Override + public String getWriteLockString(int timeout) { + return timeout == LockOptions.SKIP_LOCKED && supportsSkipLocked() + ? FOR_UPDATE_SKIP_LOCKED_SQL + : FOR_UPDATE_SQL; + } + + @Override + public String getReadLockString(int timeout) { + return timeout == LockOptions.SKIP_LOCKED && supportsSkipLocked() + ? FOR_UPDATE_SKIP_LOCKED_SQL + : FOR_UPDATE_SQL; + } } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/DB2iSqlAstTranslator.java b/hibernate-core/src/main/java/org/hibernate/dialect/DB2iSqlAstTranslator.java index 0ea3a26bfa..3abf556486 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/DB2iSqlAstTranslator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/DB2iSqlAstTranslator.java @@ -60,4 +60,9 @@ public class DB2iSqlAstTranslator extends DB2SqlAstTran public DatabaseVersion getDB2Version() { return DB2_LUW_VERSION; } + + @Override + protected String getForUpdate() { + return " for update with rs"; + } }