WITH LOCK
Пессимистическая блокировка.
DSQL, PSQL
SELECT ... FROM single_table [WHERE ...] [FOR UPDATE [OF <column-names>]] WITH LOCK [SKIP LOCKED]
Опция WITH LOCK
, обеспечивает возможность ограниченной явной пессимистической блокировки для осторожного использования в затронутых наборах строк:
-
крайне малой выборки (в идеале из одной строки) и
-
при контроле из приложения.
Caution
|
Только для экспертов
Пессимистическая блокировка редко требуется при работе с Firebird.Эту функцию можно использовать только хорошо понимая её. Требуется хорошее знание различных уровней изоляции и других параметров транзакций прежде чем использовать явную блокировку в вашем приложении. |
При успешном выполнении предложения WITH LOCK
будут заблокированы выбранные строки данных и таким образом запрещён доступ на их изменение в рамках других транзакций до момента завершения вашей транзакции.
Предложение WITH LOCK
доступно только для выборки данных (SELECT
) из одной таблицы.Предложение WITH LOCK нельзя использовать:
-
в подзапросах;
-
в запросах с объединением нескольких таблиц (
JOIN
); -
с оператором
DISTINCT
, предложениемGROUP BY
и при использовании любых агрегатных функций; -
при работе с представлениями;
-
при выборке данных из селективных хранимых процедур;
-
при работе с внешними таблицами.
Сервер, в свою очередь, для каждой записи, подпадающей под явную блокировку, возвращает версию записи, которая является в настоящее время подтверждённой (актуальной), независимо от состояния базы данных, когда был выполнен оператор выборки данных, или исключение при попытке обновления заблокированной записи.
Ожидаемое поведение и сообщения о конфликте зависят от параметров транзакции, определённых в TPB (Transaction Parameters Block):
Режим TPB | Поведение |
---|---|
isc_tpb_consistency |
Явные блокировки переопределяются неявными или явнымиблокировками табличного уровня и игнорируются. |
isc_tpb_concurrency + isc_tpb_nowait |
При подтверждении изменения записи в транзакции, стартовавшейпосле транзакции, запустившей явную блокировку, немедленновозникает исключение конфликта обновления. |
isc_tpb_concurrency + isc_tpb_wait |
При подтверждении изменения записи в транзакции, стартовавшей после транзакции, запустившей явную блокировку, немедленно возникает исключение конфликта обновления.Если в активной транзакции идёт редактирование записи (с использованием явной блокировки или нормальной оптимистической блокировкой записи), то транзакция, делающая попытку явной блокировки, ожидает окончания транзакции блокирования и, после её завершения, снова пытается получить блокировку записи.Это означает, что при изменении версии записи и подтверждении транзакции с блокировкой возникает исключение конфликта обновления. |
isc_tpb_read_committed + isc_tpb_nowait |
Если есть активная транзакция, редактирующая запись (сиспользованием явной блокировки или нормальной оптимистическойблокировкой записи), то сразу же возникает исключение конфликтаобновления. |
isc_tpb_read_committed + isc_tpb_wait |
Если в активной транзакции идёт редактирование записи (с использованием явной блокировки или нормальной оптимистической блокировкой записи), то транзакция, делающая попытку явной блокировки, ожидает окончания транзакции блокирования и, после её завершения, снова пытается получить блокировку записи. Для этого режима TPB никогда не возникает конфликта обновления. |