private void setLockOptions(Map<String, Object> props, LockOptions options) { Object lockScope = props.get(AvailableSettings.LOCK_SCOPE); if (lockScope instanceof String && PessimisticLockScope.valueOf((String) lockScope) == PessimisticLockScope.EXTENDED) { options.setScope(true); } else if (lockScope instanceof PessimisticLockScope) { boolean extended = PessimisticLockScope.EXTENDED.equals((PessimisticLockScope) lockScope); options.setScope(extended); } else if (lockScope != null) { throw new PersistenceException( "Unable to parse " + AvailableSettings.LOCK_SCOPE + ": " + lockScope); } Object lockTimeout = props.get(AvailableSettings.LOCK_TIMEOUT); int timeout = 0; boolean timeoutSet = false; if (lockTimeout instanceof String) { timeout = Integer.parseInt((String) lockTimeout); timeoutSet = true; } else if (lockTimeout instanceof Number) { timeout = ((Number) lockTimeout).intValue(); timeoutSet = true; } else if (lockTimeout != null) { throw new PersistenceException( "Unable to parse " + AvailableSettings.LOCK_TIMEOUT + ": " + lockTimeout); } if (timeoutSet) { if (timeout < 0) { options.setTimeOut(LockOptions.WAIT_FOREVER); } else if (timeout == 0) { options.setTimeOut(LockOptions.NO_WAIT); } else { options.setTimeOut(timeout); } } }
@Override protected String applyLocks( String sql, QueryParameters parameters, Dialect dialect, List<AfterLoadAction> afterLoadActions) throws QueryException { // can't cache this stuff either (per-invocation) final LockOptions lockOptions = parameters.getLockOptions(); final String result; if (lockOptions == null || (lockOptions.getLockMode() == LockMode.NONE && lockOptions.getAliasLockCount() == 0)) { return sql; } else { LockOptions locks = new LockOptions(); locks.setLockMode(lockOptions.getLockMode()); locks.setTimeOut(lockOptions.getTimeOut()); locks.setScope(lockOptions.getScope()); Iterator iter = lockOptions.getAliasLockIterator(); while (iter.hasNext()) { Map.Entry me = (Map.Entry) iter.next(); locks.setAliasSpecificLockMode( getAliasName((String) me.getKey()), (LockMode) me.getValue()); } Map keyColumnNames = null; if (dialect.forUpdateOfColumns()) { keyColumnNames = new HashMap(); for (int i = 0; i < names.length; i++) { keyColumnNames.put(names[i], persisters[i].getIdentifierColumnNames()); } } result = dialect.applyLocksToSql(sql, locks, keyColumnNames); } logQuery(queryString, result); return result; }