Время действия
Время действия
Время действия блокировки строки при обычной активности чтения/записи является оптимистическим - не выполняется никакая блокировка никаких строк до того момента, когда она действительно нужна. Пока изменения строки не отправлены на сервер, строка свободна для "получения" любой транзакцией чтения/записи.
Пессимистическая блокировка
Пессимистическая, или предварительная, блокировка может быть применена для наборов строк или для целых таблиц. Режимы блокировки таблиц уже были описаны (см. разд. "Резервирование таблиц" и "SNAPSHOT TABLE STABILITY (согласованность)").
Пессимистическая блокировка на уровне строки и на уровне набора является режимом, при котором требование по резервированию строки или небольшого набора выполняется до фактической пересылки изменения или удаления.
Явная блокировка
Возможность осуществлять явную пессимистическую блокировку строки была добавлена в синтаксис SQL-оператора SELECT в Firebird 1.5. Блокировка ограничена "внешним уровнем" операторов SELECT, которые возвращают выходные наборы или определяют курсоры. Она не может применяться к подзапросам.
Сокращенный синтаксис запроса явной пессимистической блокировки строки:
SELECT <выходной-список>
FROM <таблица-или-процедура-или-просмотр>
[WHERE <условия-поиска>]
[GROUP BY <спецификация-группирования>]
[UNION <выражение-выбора> [ALL]]
[PLAN <выражение-плана>]
[ORDER BY <список-столбцов>]
[FOR UPDATE [OF столбец1 [, столбец2 ...]] [WITH LOCK]]
Предложение FOR UPDATE, не являющееся инструкцией блокировки, указывает, что выходной набор должен передаваться клиенту по одной строке за раз, а не в виде пакета. Необязательная фраза WITH LOCK является элементом, который задает предварительную блокировку строки, как только сервер передает ее с сервера. Строки, ожидающие вывода, не блокируются.
Фиктивные изменения
Традиционным способом получения пессимистической блокировки строки в Firebird являются фиктивные изменения (dummy updates). Этот трюк позволяет использовать преимущества многоверсионной архитектуры. Клиент просто посылает на сервер для строки оператор изменения, который ничего не изменяет - он просто устанавливает значение столбца в его текущее значение, что приводит к тому, что сервер создает новую версию записи и, следовательно, блокирует для других транзакций запрос на изменение или удаление этой строки.
Условия, при которых пессимистическая блокировка может быть полезной, и технические рекомендации по ее использованию обсуждаются в главе 27.