/** @see LockingStrategy#lock */ public void lock( Serializable id, Object version, Object object, int timeout, SessionImplementor session) throws StaleObjectStateException, JDBCException { if (!lockable.isVersioned()) { throw new HibernateException( "write locks via update not supported for non-versioned entities [" + lockable.getEntityName() + "]"); } // todo : should we additionally check the current isolation mode explicitly? SessionFactoryImplementor factory = session.getFactory(); try { PreparedStatement st = session.getBatcher().prepareSelectStatement(sql); try { lockable.getVersionType().nullSafeSet(st, version, 1, session); int offset = 2; lockable.getIdentifierType().nullSafeSet(st, id, offset, session); offset += lockable.getIdentifierType().getColumnSpan(factory); if (lockable.isVersioned()) { lockable.getVersionType().nullSafeSet(st, version, offset, session); } int affected = st.executeUpdate(); if (affected < 0) { factory.getStatisticsImplementor().optimisticFailure(lockable.getEntityName()); throw new StaleObjectStateException(lockable.getEntityName(), id); } } finally { session.getBatcher().closeStatement(st); } } catch (SQLException sqle) { throw session .getFactory() .getSQLExceptionHelper() .convert( sqle, "could not lock: " + MessageHelper.infoString(lockable, id, session.getFactory()), sql); } }
/** @see LockingStrategy#lock */ public void lock(Serializable id, Object version, Object object, SessionImplementor session) throws StaleObjectStateException, JDBCException { SessionFactoryImplementor factory = session.getFactory(); try { PreparedStatement st = session.getBatcher().prepareSelectStatement(sql); try { lockable.getIdentifierType().nullSafeSet(st, id, 1, session); if (lockable.isVersioned()) { lockable .getVersionType() .nullSafeSet( st, version, lockable.getIdentifierType().getColumnSpan(factory) + 1, session); } ResultSet rs = st.executeQuery(); try { if (!rs.next()) { if (factory.getStatistics().isStatisticsEnabled()) { factory.getStatisticsImplementor().optimisticFailure(lockable.getEntityName()); } throw new StaleObjectStateException(lockable.getEntityName(), id); } } finally { rs.close(); } } finally { session.getBatcher().closeStatement(st); } } catch (SQLException sqle) { throw JDBCExceptionHelper.convert( session.getFactory().getSQLExceptionConverter(), sqle, "could not lock: " + MessageHelper.infoString(lockable, id, session.getFactory()), sql); } }