diff --git a/hibernate-core/src/test/java/org/hibernate/test/locking/LockModeTest.java b/hibernate-core/src/test/java/org/hibernate/test/locking/LockModeTest.java index 4ff62308f2..6dd9305a2d 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/locking/LockModeTest.java +++ b/hibernate-core/src/test/java/org/hibernate/test/locking/LockModeTest.java @@ -16,6 +16,7 @@ import org.hibernate.LockOptions; import org.hibernate.Session; import org.hibernate.dialect.SQLServerDialect; import org.hibernate.dialect.SybaseASE15Dialect; +import org.hibernate.dialect.SybaseDialect; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.testing.SkipForDialect; @@ -242,12 +243,19 @@ public class LockModeTest extends BaseCoreFunctionalTestCase { doInHibernate( this::sessionFactory, _session -> { TransactionUtil.setJdbcTimeout( _session ); try { - // load with write lock to deal with databases that block (wait indefinitely) direct attempts - // to write a locked row + // We used to load with write lock here to deal with databases that block (wait indefinitely) + // direct attempts to write a locked row. + // At some point, due to a bug, the lock mode was lost when applied via lock options, leading + // this code to not apply the pessimistic write lock. + // See HHH-12847 + https://github.com/hibernate/hibernate-orm/commit/719e5d0c12a6ef709bee907b8b651d27b8b08a6a. + // At least Sybase waits indefinitely when really applying a PESSIMISTIC_WRITE lock here (and + // the NO_WAIT part is not applied by the Sybase dialect so it doesn't help). + // For now going back to LockMode.NONE as it's the lock mode that has been applied for quite + // some time and it seems our supported databases don't have a problem with it. A it = _session.get( A.class, id, - new LockOptions( LockMode.PESSIMISTIC_WRITE ).setTimeOut( LockOptions.NO_WAIT ) + new LockOptions( LockMode.NONE ).setTimeOut( LockOptions.NO_WAIT ) ); _session.createNativeQuery( updateStatement() ) .setParameter( "value", "changed" ) @@ -272,7 +280,8 @@ public class LockModeTest extends BaseCoreFunctionalTestCase { } protected String updateStatement() { - if( SQLServerDialect.class.isAssignableFrom( DIALECT.getClass() ) ) { + if ( SQLServerDialect.class.isAssignableFrom( DIALECT.getClass() ) + || SybaseDialect.class.isAssignableFrom( DIALECT.getClass() ) ) { return "UPDATE T_LOCK_A WITH(NOWAIT) SET a_value = :value where id = :id"; } return "UPDATE T_LOCK_A SET a_value = :value where id = :id";