Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.13;
Скачать: CL | DM;

Вниз

Как правильно и/или лучше сделать откат?   Найти похожие ветки 

 
VladimirKVT   (2004-01-21 07:58) [0]

Господа! Я последовательно записываю данные в четыре таблицы следующим образом :
try
// Здесь делается Update/ Insert/ Delete
// и сохраняются критичные данные во временные переменные
// для отката
Step := 1;
YesWrite := True;
except
YesWrite := False;
end;
if YesWrite = True then //Следующий шаг
try
// Здесь делается Update/ Insert/ Delete
// и сохраняются критичные данные во временные переменные
// для отката
Step := 2;
YesWrite := True;
except
YesWrite := False;
end;
.... и т.д. и т.п.
if Step < 4 then
// делаю откат соответствующих выполненных верных шагов-Step,
// т.е. выполняю противоположные действия этих шагов, беря
// данные из запомненных временных переменных

Все это работает, только может кто посоветует как это сделать более правильно и/или используя откат MSSQL ???


 
mtb   (2004-01-21 08:14) [1]

Танзакции не работают?


 
KSergey ©   (2004-01-21 08:52) [2]

Надо использовать транзакции.
ТОлько более правильно их использовать в рамках ХП на сервере. Причина - возможный порыв кабеля/завис клиентской машины, т.е. ситуации, когда обработка исключений не спасет, и транзакция намертво зависнет на сервере.


 
VladimirKVT   (2004-01-21 08:58) [3]

Плз. расскажите, покажите как из Дельфи работать с транзакциями SQL ???


 
KSergey ©   (2004-01-21 09:24) [4]

1.ADOConnection.BeginTrans/CommitTrans/RollbackTrans

2.Выполнять запросы "BEGIN TRANSACTION" и т.п.


 
stone ©   (2004-01-21 09:41) [5]


> VladimirKVT (21.01.04 08:58) [3]
> Плз. расскажите, покажите как из Дельфи работать с транзакциями
> SQL


ADOConnection.BeginTrans; // Начать транзакцию
try
... // Здесь делается Update/ Insert/ Delete
ADOConnection.CommitTrans; // Все нормально - подтверждаем
except
ADOConnection.RollbackTrans; // Ошибка - откатываем
end;


 
VladimirKVT   (2004-01-21 10:40) [6]

> stone

У меня один ADOConnection используется для всех четырех SQL-запросов. Допустим два первых выполнились без ошибок, а третий - с ошибкой. Как мне тогда вернуть два первых в начальное состояние, видимо, если пользоваться Вашим кодом , то надо каждому свой ADOConnection ??


 
stone ©   (2004-01-21 10:51) [7]


> надо каждому свой ADOConnection ??


Нет как раз один для всех, при этом произойдет откат ВСЕХ действий между BeginTrans и CommitTrans

PS. Почитайте что-нибудь о транзакциях, многое станет ясно...


 
stone ©   (2004-01-21 10:52) [8]


> между BeginTrans и CommitTrans


Извиняюсь!!!
между BeginTrans и RollbackTrans конечно


 
VladimirKVT   (2004-01-21 11:23) [9]

> stone

Вот так правильно?


ADOConnection.BeginTrans; // Начать транзакцию
try
... // Здесь делается Update/ Insert/ Delete
try
ADOQUpdate.Close;
ADOQUpdate.SQL.Clear;
ADOQUpdate.SQL.Add("Insert POSAD_MAIN ");
ADOQUpdate.SQL.Add(" (NPLAV,PPPIC,DATPOREZ)");
ADOQUpdate.SQL.Add(" Values("""+S_Npav+""","""+S_Pic+""",convert(datetime,"""+DTPOREZ+""",104))");
ADOQUpdate.ExecSQL;
except
ShowMessage("


 
Desdechado ©   (2004-01-21 11:51) [10]

тебе ж написали - try-except - в ЕДИНСТВЕННОМ экземпляре, а внутри все сохранение, удаление, модификация.
при успехе в конце (перед самым except) - подтверждение, иначе откат. Откат делается автоматически при неуспехе транзакции, и не надо сохранять в промежуточных переменных каких-то значений, они и так в кэше датасета хранятся, да и в БД до commit ничего не сохранится.


 
VladimirKVT   (2004-01-21 13:41) [11]

Спасибо всем !!!


 
jocko ©   (2004-01-21 13:47) [12]

За все ответы кроме второго не благодарить - посылать надо !



Страницы: 1 вся ветка

Текущий архив: 2004.02.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.03 c
6-38990
Zilog_
2003-12-10 18:40
2004.02.13
Проблема с WebBrowser~ом


4-39134
vasil
2003-12-09 13:00
2004.02.13
Как на WinAPI заполнить ComboBox


1-38888
Пубертанец
2004-02-04 15:15
2004.02.13
Как удалить строку из TStringGrid


1-38799
Qwer
2004-02-03 12:48
2004.02.13
ApplicationEvents не перехватывает Exception в DLL


8-38961
SergeyDon
2003-10-11 15:35
2004.02.13
ламерский вопрос: чем отличается использование OpenGL от DirectX?