Блокировать таблицу
Назначение
Команда
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]; /*Имя блокируемого объекта*/ };
Примечания
-
Значение
Owner
можно получить при помощи командыFUSR
интерфейса нижнего уровня или выбрать из системной таблицы$$$USR
(при наличии права на SELECT-запросы к этой таблице). -
Если длина имени объекта меньше 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; }