Блокировать запись

Назначение
 

Команда 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;
   }
Пример использования команды