FirebirdSQL logo

FOR UPDATE [OF]

Синтаксис
SELECT ...
  FROM single_table
  [WHERE ...]
  [FOR UPDATE [OF <column-names>]]

Предложение FOR UPDATE не делает то, что от него ожидается.В настоящее время единственный эффект от его использования заключается лишь в отключении упреждающей выборки в буфер.

Tip

Это, вероятно, изменится в будущем: план состоит в том, чтобы проверять курсоры, отмеченные как FOR UPDATE, действительно ли они обновляемые, и отклонять позиционированные обновления и удаления для курсоров, оцененных как не обновляемый.

Предложение OF не делает ничего вообще.

WITH LOCK

Назначение

Пессимистическая блокировка.

Доступно

DSQL, PSQL

Синтаксис
SELECT ...
FROM single_table
[WHERE ...]
[FOR UPDATE [OF <column-names>]]
WITH LOCK [SKIP LOCKED]

Опция WITH LOCK, обеспечивает возможность ограниченной явной пессимистической блокировки для осторожного использования в затронутых наборах строк:

  1. крайне малой выборки (в идеале из одной строки) и

  2. при контроле из приложения.

Caution
Только для экспертов

Пессимистическая блокировка редко требуется при работе с Firebird.Эту функцию можно использовать только хорошо понимая её.

Требуется хорошее знание различных уровней изоляции и других параметров транзакций прежде чем использовать явную блокировку в вашем приложении.

При успешном выполнении предложения WITH LOCK будут заблокированы выбранные строки данных и таким образом запрещён доступ на их изменение в рамках других транзакций до момента завершения вашей транзакции.

Предложение WITH LOCK доступно только для выборки данных (SELECT) из одной таблицы.Предложение WITH LOCK нельзя использовать:

  • в подзапросах;

  • в запросах с объединением нескольких таблиц (JOIN);

  • с оператором DISTINCT, предложением GROUP BY и при использовании любых агрегатных функций;

  • при работе с представлениями;

  • при выборке данных из селективных хранимых процедур;

  • при работе с внешними таблицами.

Сервер, в свою очередь, для каждой записи, подпадающей под явную блокировку, возвращает версию записи, которая является в настоящее время подтверждённой (актуальной), независимо от состояния базы данных, когда был выполнен оператор выборки данных, или исключение при попытке обновления заблокированной записи.

Ожидаемое поведение и сообщения о конфликте зависят от параметров транзакции, определённых в TPB (Transaction Parameters Block):

Table 1. Влияние параметров TPB на явную блокировку
Режим 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 никогда не возникает конфликта обновления.