Предложение FOR UPDATE в Операторе SELECT
Блокирует строки таблицы
EMPLOYEES
, где job_id является SA_REP.

Блокировка освобождается, только когда Вы выполняете
ROLLBACK
илиCOMMIT
.Если оператор
SELECT
пытается заблокировать строку, которая заблокирована другим пользователем, база данных ожидает, пока строка не становится доступна, и затем возвращает результат оператораSELECT
.
Когда Вы выполняете оператор SELECT
в базе данных, чтобы запросить некоторые записи, никакие блокировки не устанавливаются на выбранные строки. Вообще, это требуется, потому что число записей, заблокированных в любой момент времени, (по умолчанию) сводится к абсолютному минимуму: только те записи, которые были изменены, но еще не зафиксированы, блокируются. Даже тогда другие пользователи будут в состоянии считать эти записи, как они выглядели перед изменением ("исходный образ" данных). Иногда, однако, можно захотеть заблокировать ряд записей даже до того, как Вы измените их в своей программе. Oracle предлагает предложение FOR UPDATE
оператора SELECT
, чтобы выполнить эту блокировку.
Когда Вы выполняете оператор SELECT ... FOR UPDATE, система управления реляционной базой данных (RDBMS) автоматически получает монопольные блокировки на уровне строки для всех строк, идентифицированных оператором SELECT
, таким образом делая эти записи доступными “только для Ваших изменений.” Никто больше не будет в состоянии изменить любую из этих записей, пока Вы не выполните ROLLBACK
или COMMIT
.
Можно добавить дополнительное ключевое слово NOWAIT
к предложению FOR UPDATE
, чтобы сказать серверу Oracle не ожидать, если таблица была заблокирована другим пользователем. В этом случае управление будет сразу возвращено к Вашей программе или к Вашей среде SQL Developer так, чтобы можно было выполнить другую работу или просто подождать некоторые время перед тем, как попробовать еще раз. Без предложения NOWAIT
, Ваш процесс блокируется до тех пор, пока таблица не станет доступна, когда блокировки будет освобождены другим пользователем через выполнение команды COMMIT
или ROLLBACK
.