Фиксировать изменения

Назначение
 

Команда 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.

Таблица 11. Описание полей структуры данных SAVE_POINT
ПолеОписание
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

тоже зафиксируются в БД, транзакцию можно продолжать.

Таблица 12. Алгоритм фиксации изменений при наличии контрольных точек
Значение поля Результат
SavePointNamedName
0не важноне важноФиксация до точки SP3
10не важноФиксация до точки SP3
11SP3Фиксация до точки SP3
11''Ошибка
11SP2Ошибки нет, но 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;
   }
Пример использования команды