CommitRetaining и Rollback
Добавлено: 10 фев 2007, 14:25
Есть небольшая неясность (для меня) в том как поступает RollBack с изменениями закрепленными CommitRetaining.
СУБД: InterBase 7.0.1
IBX: 7.x.x (не помню)
Delphi 7
Ситуация: есть "РОБОТ", который по таймеру собирает внешние события из 2-х источников и формирует реакцию
на них (отправляет СМС и производит изменения некоторых записей в базе). Т.е. добавляет в список событий
(события однотипные - источники разные) то, что собрал. Далее - стартует транзаккию, пробегает по этому списку
в цикле вызывая хранимку, делая CommitRetaining и удаляя текущий
элемент списка. Иногда возникает ситуация, когда запись заблокирована (холостой update),
т.е. lock conflict on no wait transaction. Ситуация ловится, ошибка пишется в лог, элемент НЕ удаляется
(для повторной попытки), выполняется RollBack.
По окончании цикла - попытка Commit.
Вопрос: что происходит с изменениями в базе, которые зафиксены CommitRetaining при RollBack,
они действительно остаются или нет?
В хелпе по IBX написано, что RollBack отменяет ВСЕ изменения в
транзакции.
В статье: http://ibase.ru/devinfo/ibtrans.htm говорится, что
CommitRetaining сохраняет изменения и продолжает работать.
Судя по записям в базе и логу СМС, Rollback все-таки сносит изменения.
Помогите разобраться, пжаллста.
СУБД: InterBase 7.0.1
IBX: 7.x.x (не помню)
Delphi 7
Ситуация: есть "РОБОТ", который по таймеру собирает внешние события из 2-х источников и формирует реакцию
на них (отправляет СМС и производит изменения некоторых записей в базе). Т.е. добавляет в список событий
(события однотипные - источники разные) то, что собрал. Далее - стартует транзаккию, пробегает по этому списку
в цикле вызывая хранимку, делая CommitRetaining и удаляя текущий
элемент списка. Иногда возникает ситуация, когда запись заблокирована (холостой update),
т.е. lock conflict on no wait transaction. Ситуация ловится, ошибка пишется в лог, элемент НЕ удаляется
(для повторной попытки), выполняется RollBack.
По окончании цикла - попытка Commit.
Код: Выделить всё
if (not IBTransaction1.Active) then IBTransaction1.StartTransaction;
i := 0;
while i < LR.Count do
try
IBQuery1.ParamByName('XXXX').AsString := LR.Names[i];
IBQuery1.ParamByName('XXXX').AsString := LR.ValueFromIndex[i];
IBQuery1.ExecSQL;
IBTransaction1.CommitRetaining;
LR.Delete(i);
except
on E: Exception do
begin
IBTransaction2.StartTransaction;
IBQuery2.ParamByName('XXXX').AsString := LR.Names[i];;
IBQuery2.ParamByName('XXXX').AsString := LR.ValueFromIndex[i];
IBQuery2.ParamByName('ERR_MSG').AsString := E.Message;
IBQuery2.ExecSQL;
IBTransaction2.Commit;
Inc(i);
IBTransaction1.RollBack;
end;
end;
if (IBTransaction1.Active) then IBTransaction1.Commit;
они действительно остаются или нет?
В хелпе по IBX написано, что RollBack отменяет ВСЕ изменения в
транзакции.
В статье: http://ibase.ru/devinfo/ibtrans.htm говорится, что
CommitRetaining сохраняет изменения и продолжает работать.
Судя по записям в базе и логу СМС, Rollback все-таки сносит изменения.
Помогите разобраться, пжаллста.