Блокировать таблицу

Назначение
 

Команда LREL предназначена для явной монопольной блокировки таблицы или обновляемого представления.

Параметры вызова

inter(CBL, VarBuf, NULL, [CondBuf], NULL);

Входные данные

Входными данными являются:

  • контрольный блок CBL;

  • буфер параметров команды VarBuf.

В контрольном блоке должны быть заполнены поля:

Имя поля Значение
NumChan Номер канала
Command "LREL"
Node Имя ЛИНТЕР-сервера

Буфер описания параметров команды VarBuf должен содержать информацию о блокируемом объекте в следующем виде:

struct FREL_IN
   {
   L_LONG Owner;                /*Идентификатор владельца*/
   L_CHAR TblName[MAX_ID_LEN];  /*Имя блокируемого объекта*/
   };

Примечания

  1. Значение Owner можно получить при помощи команды FUSR интерфейса нижнего уровня или выбрать из системной таблицы $$$USR (при наличии права на SELECT-запросы к этой таблице).

  2. Если длина имени объекта меньше MAX_ID_LEN символов, то поле TblName должно быть дополнено справа пробелами до MAX_ID_LEN символов.

Выходные данные

Выходными данными является контрольный блок CBL.

В нем будут возвращены:

Имя поля Значение
CodErr Код завершения запроса к СУБД ЛИНТЕР
SysErr Код состояния ОС
Описание

Максимальное суммарное количество блокировок в СУБД ЛИНТЕР (по всем активным каналам) равно 100. Если один и тот же объект блокируется несколько раз, то увеличивается только счетчик блокировок данного объекта, но общее количество блокировок не увеличивается.

Все обновляемые представления, созданные из блокированной таблицы, также блокируются.

Примечание

Идеология СУБД ЛИНТЕР подразумевает, что запросы подаются не только от имени пользователя, но и от имени приложения, и даже от имени нити приложения. Поэтому внутри нити, блокировавшей таблицу, сама блокировка ощущаться не будет, однако для других приложений и даже нитей того же приложения таблица станет блокированной.

При завершении транзакции (COMMIT или ROLLBACK) установленная блокировка сбрасывается.

При выполнении по каналу оператора определения данных (типа CREATE…) установленная в нем блокировка сбрасывается.

При нормальном или аварийном закрытии канала установленная в нем блокировка сбрасывается.

При завершении работы ядра СУБД все блокировки сбрасываются.

При выполнении SELECT-запроса с блокированной таблицей в режиме WAIT (действует по умолчанию) клиентское приложение переходит в состояние ожидания разблокирования таблицы, в режиме NOWAIT – выдается код завершения, информирующий о блокировке таблицы.

Коды завершения
Код Описание
NORMAL Нормальное завершение
EORR Блокируемый объект не найден
RELLOCKED Блокируемый объект уже заблокирован другим приложением или другой нитью приложения
Пример формирования команды
#include < string.h >
#include < stdlib.h >
#include "inter.h"

L_LONG LinterLREL(TCBL *pCBL, L_CHAR *User, L_CHAR *Table)
   {
   FREL_IN Tbl;
   L_LONG User_ID;
   L_LONG Err;

   Err=LinterFUSR(pCBL, User, &User_ID);
   if (Err == NORMAL)
     {
     L_LONG len;

     Tbl.Owner=User_ID;
     len=strlen(Table);
     if (len  > MAX_ID_LEN)
       {
       return SQLLONGID;
       }
     memset(Tbl.TblName, ' ', MAX_ID_LEN);
     memcpy(Tbl.TblName, Table, len);
     }
   else
     return Err;

   memcpy(pCBL- >Command, "LREL", 4);
   pCBL- >PrzExe &= ~Q_ASYNC;
   inter(pCBL, &Tbl, NULL, NULL, NULL);
   return pCBL- >CodErr;
   }
Пример использования команды