Фиксировать изменения
Назначение
Команда
COMT
предназначена для сохранения (фиксации) в БД всех изменений,
сделанных приложением во время текущей транзакции.
Команда
COMT
эквивалентна SQL-запросу COMMIT; (см. документ «СУБД ЛИНТЕР. Справочник по SQL»,
пункт «Сохранение изменений»).
Параметры вызова
inter(CBL, {VarBuf | NULL}, NULL, [CondBuf], NULL);
Входные данные
Входными данными являются:
-
контрольный блок
CBL
; -
буфер параметров
VarBuf
(для транзакции с контрольными точками). В противном случае значение параметра должно быть NULL.
В контрольном блоке должны быть заполнены поля:
Имя поля | Значение | |
---|---|---|
NumChan
| Номер канала | |
Command
|
"COMT"
| |
Node
| Имя ЛИНТЕР-сервера |
Буфер параметров
VarBuf
используется при обработке команды
COMT
для транзакции с контрольными точками
и должен содержать информацию о месте в транзакции, c которого
необходимо выполнить фиксацию изменений в БД:
typedef struct { L_BYTE SavePoint; L_BYTE Named; L_CHAR Name[MAX_ID_LEN]; } SAVE_POINT;
Описание полей структуры
SAVE_POINT
приведено в таблице
11.
Поле | Описание |
---|---|
SavePoint
|
Режим обработки контрольных точек: 0 – игнорировать контрольные точки (если они есть); 1 – учитывать наличие контрольных точек. |
Named
|
Тип контрольной точки: 0 – неименованная; 1 – именованная. |
Name
| Имя (регистрозависимое) контрольной точки (в случае именованной точки). Должно быть заполнено пробелами до длины MAX_ID_LEN. |
Выходные данные
Выходными данными является контрольный блок
CBL
.
В нем будут возвращены:
Имя поля | Значение | |
---|---|---|
CodErr
| Код завершения запроса к СУБД ЛИНТЕР | |
SysErr
| Код состояния ОС |
Описание
После выполнения команды
COMT
текущая транзакция завершается с сохранением
изменений в БД.
Изменения, проводимые приложением в таблицах БД, становятся доступны всем пользователям (клиентским приложениям), имеющим доступ к таблицам, задействованным в данной транзакции.
Если клиентское приложение имеет главный и подчиненные каналы и
команда COMT подается по главному каналу, то
COMT
автоматически выполняется и для всех транзакций в подчиненных
каналах.
Если у канала есть подчиненные каналы, то подача
COMT
по главному каналу должна выполняться после завершения всех
запросов в подчиненных каналах, в противном случае поведение СУБД ЛИНТЕР не специфицировано.
При наличии в канале выборки данных и подачи команды COMT по этому каналу выборка данных будет закрыта только при запуске ядра СУБД в режиме /COMPATIBILITY=STANDARD.
Правила выполнения команды (таблица 12):
-
если VarBuf == NULL или поле SavePoint == 0, то команда выполняется без учета контрольных точек;
-
если поле SavePoint == 1, то фиксация изменений выполняется до контрольной точки;
-
если Named == 0, то фиксация изменений выполняется до последней контрольной точки;
-
если Named == 1, то фиксация изменений выполняется до контрольной точки, имя которой задано в поле Name.
Контрольная точка, соответствующая началу транзакции, должна
ставиться сразу после команды
COMT/RBAC
, а не до неё.
Например, если необходимо обращаться к контрольной точке SP3:
Err=LinterCOMT(&CBLconnect); Err=LinterNotSelect(&CBLconnect, "set savepoint SP3;");
При нижеследующем порядке установки контрольной точки она будет недоступна:
Err=LinterNotSelect(&CBLconnect, "set savepoint SP3;"); Err=LinterCOMT(&CBLconnect);
При возникновении ошибки приложение должно откатывать всю
транзакцию.
После выполнения команды
COMT
до некоторой контрольной точки все более
ранние контрольные точки автоматически удаляются.
Пример
«действия 1» SET SAVEPOINT SP1 «действия 2» COMT (SP1)
«действия 1» зафиксированы в БД, контрольная точка SP1 удалена,
«действия 2» пока не зафиксированы в БД, но если подать COMT
–
тоже зафиксируются в БД, транзакцию можно продолжать.
Значение поля | Результат | ||
---|---|---|---|
SavePoint | Named | Name | |
0 | не важно | не важно | Фиксация до точки SP3 |
1 | 0 | не важно | Фиксация до точки SP3 |
1 | 1 | SP3 | Фиксация до точки SP3 |
1 | 1 | '' | Ошибка |
1 | 1 | SP2 | Ошибки нет, но COMMIT не выполняется |
Коды завершения
Код | Описание | |
---|---|---|
NORMAL | Нормальное завершение (изменения зафиксированы в БД) | |
ILLTRANS | Неправильная транзакция. Эта ситуация означает, что все или часть данных, измененные приложением в текущей транзакции, были уже изменены некоторой другой транзакцией, и эти действия зафиксированы в БД. Для текущей транзакции выполняется откат |
Пример формирования команды
#include < string.h > #include < stdlib.h > #include "inter.h" L_LONG LinterCOMT(TCBL *pCBL) { memcpy(pCBL- >Command, "COMT", 4); pCBL- >PrzExe &= ~Q_ASYNC; inter(pCBL, NULL, NULL, NULL, NULL); return pCBL- >CodErr; }