@Override public LockRequest setTimeOut(int timeout) { lockOptions.setTimeOut( timeout ); return this; }
public void setLockTimeout(int timeout) { this.lockOptions.setTimeOut(timeout); }
/** * Apply the lock timeout (in seconds!) hint * * @param timeout The timeout (in seconds!) specified as a hint * * @return {@code true} if the hint was "applied" */ protected boolean applyLockTimeoutHint(int timeout) { getLockOptions().setTimeOut( timeout ); return true; }
public void setLockTimeout(int timeout) { if ( timeout != lockOptions.getTimeOut() ) { writingOnLockOptions(); this.lockOptions.setTimeOut( timeout ); } }
private LockOptions determineLockOptions(LockModeType lockModeType, Integer lockTimeoutHint, Boolean followOnLocking) { LockOptions lockOptions = new LockOptions( LockModeConverter.convertToLockMode( lockModeType ) ) .setFollowOnLocking( followOnLocking ); if ( lockTimeoutHint != null ) { lockOptions.setTimeOut( lockTimeoutHint ); } return lockOptions; }
@Override public Session.LockRequest lockRequest(LockOptions lockOptions) { int timeout = lockOptions.getTimeOut(); if (timeout > MAX_TIMEOUT) { lockOptions.setTimeOut(MAX_TIMEOUT); } LOG.debug("Build lock request with options {}", lockOptions); return getSession().buildLockRequest(lockOptions); }
/** * Perform a shallow copy. * * @param source Source for the copy (copied from) * @param destination Destination for the copy (copied to) * * @return destination */ public static LockOptions copy(LockOptions source, LockOptions destination) { destination.setLockMode( source.getLockMode() ); destination.setScope( source.getScope() ); destination.setTimeOut( source.getTimeOut() ); if ( source.aliasSpecificLockModes != null ) { destination.aliasSpecificLockModes = new HashMap<String,LockMode>( source.aliasSpecificLockModes ); } destination.setFollowOnLocking( source.getFollowOnLocking() ); return destination; } }
protected void applySkipLocked(Query query) { query.setLockOptions( new LockOptions( lockMode() ) .setTimeOut( LockOptions.SKIP_LOCKED ) ); }
@Override @SuppressWarnings("unchecked") public QueryImplementor setLockOptions(LockOptions lockOptions) { this.lockOptions.setLockMode( lockOptions.getLockMode() ); this.lockOptions.setScope( lockOptions.getScope() ); this.lockOptions.setTimeOut( lockOptions.getTimeOut() ); this.lockOptions.setFollowOnLocking( lockOptions.getFollowOnLocking() ); return this; }
@Test public void testLockTimeoutNoAliasNoWait() { assertEquals( " for update nowait", dialect.getForUpdateString( new LockOptions( LockMode.PESSIMISTIC_READ ) .setTimeOut( LockOptions.NO_WAIT ) ) ); assertEquals( " for update nowait", dialect.getForUpdateString( new LockOptions( LockMode.PESSIMISTIC_WRITE ) .setTimeOut( LockOptions.NO_WAIT ) ) ); }
@Test public void testLockTimeoutNoAliasSkipLocked() { assertEquals( " for update skip locked", dialect.getForUpdateString( new LockOptions( LockMode.PESSIMISTIC_READ ) .setTimeOut( LockOptions.SKIP_LOCKED ) ) ); assertEquals( " for update skip locked", dialect.getForUpdateString( new LockOptions( LockMode.PESSIMISTIC_WRITE ) .setTimeOut( LockOptions.SKIP_LOCKED ) ) ); }
@Test @RequiresDialect({ Oracle8iDialect.class, PostgreSQL81Dialect.class, SQLServer2005Dialect.class } ) public void testNoWait() throws NoSuchFieldException, IllegalAccessException { Session session = sessionFactory().openSession(); session.beginTransaction(); try { session.createQuery( "select a from A a", A.class ) .unwrap( org.hibernate.query.Query.class ) .setLockOptions( new LockOptions( LockMode.PESSIMISTIC_WRITE ) .setTimeOut( LockOptions.NO_WAIT ) ) .list(); String lockingQuery = sqlStatementInterceptor.getSqlQueries().getLast(); assertTrue( lockingQuery.toLowerCase().contains( "nowait") ); } finally { session.getTransaction().commit(); session.close(); } }
@Test @RequiresDialect({ Oracle8iDialect.class, PostgreSQL95Dialect.class }) public void testSkipLocked() throws NoSuchFieldException, IllegalAccessException { Session session = sessionFactory().openSession(); session.beginTransaction(); try { session.createQuery( "select a from A a", A.class ) .unwrap( org.hibernate.query.Query.class ) .setLockOptions( new LockOptions( LockMode.PESSIMISTIC_WRITE ) .setTimeOut( LockOptions.SKIP_LOCKED ) ) .list(); String lockingQuery = sqlStatementInterceptor.getSqlQueries().getLast(); assertTrue( lockingQuery.toLowerCase().contains( "skip locked") ); } finally { session.getTransaction().commit(); session.close(); } } }
@Test public void testLockTimeoutAliasNoWait() { String alias = "a"; assertEquals( " for update nowait", dialect.getForUpdateString( alias, new LockOptions( LockMode.PESSIMISTIC_READ ).setAliasSpecificLockMode( alias, LockMode.PESSIMISTIC_READ ) .setTimeOut( LockOptions.NO_WAIT ) ) ); assertEquals( " for update nowait", dialect.getForUpdateString( alias, new LockOptions( LockMode.PESSIMISTIC_WRITE ).setAliasSpecificLockMode( alias, LockMode.PESSIMISTIC_WRITE ) .setTimeOut( LockOptions.NO_WAIT ) ) ); }
@Test public void testLockTimeoutAliasSkipLocked() { String alias = "a"; assertEquals( " for update skip locked", dialect.getForUpdateString( alias, new LockOptions( LockMode.PESSIMISTIC_READ ).setAliasSpecificLockMode( alias, LockMode.PESSIMISTIC_READ ) .setTimeOut( LockOptions.SKIP_LOCKED ) ) ); assertEquals( " for update skip locked", dialect.getForUpdateString( alias, new LockOptions( LockMode.PESSIMISTIC_WRITE ).setAliasSpecificLockMode( alias, LockMode.PESSIMISTIC_WRITE ) .setTimeOut( LockOptions.SKIP_LOCKED ) ) ); } }
@Override public void cascade( EventSource session, Object child, String entityName, Object anything, boolean isCascadeDeleteEnabled) { LOG.tracev( "Cascading to lock: {0}", entityName ); LockMode lockMode = LockMode.NONE; LockOptions lr = new LockOptions(); if ( anything instanceof LockOptions ) { LockOptions lockOptions = (LockOptions) anything; lr.setTimeOut( lockOptions.getTimeOut() ); lr.setScope( lockOptions.getScope() ); lr.setFollowOnLocking( lockOptions.getFollowOnLocking() ); if ( lockOptions.getScope() ) { lockMode = lockOptions.getLockMode(); } } lr.setLockMode( lockMode ); session.buildLockRequest( lr ).lock( entityName, child ); }
@Test public void testJoin() { doInJPA( this::entityManagerFactory, em -> { SubEntity sub = new SubEntity(); em.persist( sub ); MainEntity main = new MainEntity(); main.setSub( sub ); em.persist( main ); this.mainId = main.getId(); }); doInJPA( this::entityManagerFactory, em -> { EntityPersister entityPersister = ( (MetamodelImplementor) em.getMetamodel() ) .entityPersister( MainEntity.class ); // use some specific lock options to trigger the creation of a loader with lock options LockOptions lockOptions = new LockOptions( LockMode.NONE ); lockOptions.setTimeOut( 10 ); MainEntity main = (MainEntity) entityPersister.load( this.mainId, null, lockOptions, (SharedSessionContractImplementor) em ); assertNotNull( main.getSub() ); } ); }
protected String generateLockString(int lockTimeout) { final SessionFactoryImplementor factory = getLockable().getFactory(); final LockOptions lockOptions = new LockOptions( getLockMode() ); lockOptions.setTimeOut( lockTimeout ); final SimpleSelect select = new SimpleSelect( factory.getDialect() ) .setLockOptions( lockOptions ) .setTableName( getLockable().getRootTableName() ) .addColumn( getLockable().getRootTableIdentifierColumnNames()[0] ) .addCondition( getLockable().getRootTableIdentifierColumnNames(), "=?" ); if ( getLockable().isVersioned() ) { select.addCondition( getLockable().getVersionColumnName(), "=?" ); } if ( factory.getSessionFactoryOptions().isCommentsEnabled() ) { select.setComment( getLockMode() + " lock " + getLockable().getEntityName() ); } return select.toStatementString(); } }
protected String generateLockString(int timeout) { final SessionFactoryImplementor factory = getLockable().getFactory(); final LockOptions lockOptions = new LockOptions( getLockMode() ); lockOptions.setTimeOut( timeout ); final SimpleSelect select = new SimpleSelect( factory.getDialect() ) .setLockOptions( lockOptions ) .setTableName( getLockable().getRootTableName() ) .addColumn( getLockable().getRootTableIdentifierColumnNames()[0] ) .addCondition( getLockable().getRootTableIdentifierColumnNames(), "=?" ); if ( getLockable().isVersioned() ) { select.addCondition( getLockable().getVersionColumnName(), "=?" ); } if ( factory.getSessionFactoryOptions().isCommentsEnabled() ) { select.setComment( getLockMode() + " lock " + getLockable().getEntityName() ); } return select.toStatementString(); } }
protected String generateLockString(int lockTimeout) { final SessionFactoryImplementor factory = getLockable().getFactory(); final LockOptions lockOptions = new LockOptions( getLockMode() ); lockOptions.setTimeOut( lockTimeout ); final SimpleSelect select = new SimpleSelect( factory.getDialect() ) .setLockOptions( lockOptions ) .setTableName( getLockable().getRootTableName() ) .addColumn( getLockable().getRootTableIdentifierColumnNames()[0] ) .addCondition( getLockable().getRootTableIdentifierColumnNames(), "=?" ); if ( getLockable().isVersioned() ) { select.addCondition( getLockable().getVersionColumnName(), "=?" ); } if ( factory.getSessionFactoryOptions().isCommentsEnabled() ) { select.setComment( getLockMode() + " lock " + getLockable().getEntityName() ); } return select.toStatementString(); } }