Блокировать запись
Назначение
Команда
LROW
блокирует записи одной или нескольких таблиц или обновляемого
представления.
Параметры вызова
inter(CBL, NULL, NULL, [CondBuf], NULL);
Входные данные
Входными данными является контрольный блок
CBL
.
В нем должны быть заполнены поля:
Имя поля | Значение | |
---|---|---|
NumChan
| Номер канала | |
Command
|
"LROW"
| |
Node
| Имя ЛИНТЕР-сервера |
Выходные данные
Выходными данными является контрольный блок
CBL
.
В нем будут возвращены:
Имя поля | Значение | |
---|---|---|
CodErr
| Код завершения запроса к СУБД ЛИНТЕР | |
SysErr
| Код состояния ОС |
Описание
Команда
LROW
блокирует
текущую
запись таблицы (обновляемого представления).
Текущей записью в канале является последняя выбранная или измененная
запись некоторой таблицы либо обновляемого представления.
Таким образом, команда
LROW
имеет смысл только в контексте следующих запросов:
-
SELECT;
-
SELECT FOR UPDATE;
-
UPDATE.
Примечание
При невыполнении данных условий поведение СУБД не определено.
При выполнении
LROW
вне указанного контекста она игнорируется (в этом случае код
завершения команды будет
NORMAL,
как и при нормальном завершении).
Выполнение
LROW
не приводит к изменению положения текущей записи таблицы
(представления).
При задании модификатора FOR UPDATE все записи обновляемой таблицы, вошедшие в выборку, сразу же блокируются от изменения параллельно работающими пользователями БД (каналами СУБД). Такие записи можно читать (для них задается внутренняя блокировка). На каждую запись может быть наложена только одна блокировка FOR UPDATE. Если число записей в выборке данных превышает 1000, то в этом случае блокируется вся таблица. Блокировка действует до обработки запроса COMMIT/ROLLBACK.
По одному каналу можно явно блокировать только одну запись; при блокировании другой записи предыдущая блокировка автоматически сбрасывается.
При завершении транзакции (COMMIT или ROLLBACK) установленные блокировки сбрасываются.
При выполнении по каналу оператора определения данных установленные в нем блокировки сбрасываются.
Идеология СУБД ЛИНТЕР подразумевает, что запросы подаются не только от имени пользователя, но и от имени приложения, и даже нити приложения. Поэтому внутри нити, блокировавшей запись, сама блокировка ощущаться не будет. Однако для других приложений и даже для других нитей того же приложения запись станет блокированной.
Коды завершения
Код | Описание | |
---|---|---|
NORMAL | Нормальное завершение | |
Row_Locked | Запись блокирована другим приложением или другой нитью приложения |
Пример формирования команды
#include < string.h > #include < stdlib.h > #include "inter.h" L_LONG LinterLROW(TCBL *pCBL) { memcpy(pCBL- >Command, "LROW", 4); pCBL- >PrzExe &= ~Q_ASYNC; inter(pCBL, NULL, NULL, NULL, NULL); return pCBL- >CodErr; }