![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно и/или лучше сделать откат? [D5, D7, MSSQL]
VladimirKVT © (2004-01-21 07:58:00)
Господа! Я последовательно записываю данные в четыре таблицы следующим образом :
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 ???
jocko (2004-01-21 13:47:00) [1]
За все ответы кроме второго не благодарить - посылать надо !
VladimirKVT (2004-01-21 13:41:00) [2]
Спасибо всем !!!
Desdechado (2004-01-21 11:51:00) [3]
тебе ж написали - try-except - в ЕДИНСТВЕННОМ экземпляре, а внутри все сохранение, удаление, модификация.
при успехе в конце (перед самым except) - подтверждение, иначе откат. Откат делается автоматически при неуспехе транзакции, и не надо сохранять в промежуточных переменных каких-то значений, они и так в кэше датасета хранятся, да и в БД до commit ничего не сохранится.
VladimirKVT (2004-01-21 11:23:00) [4]
> 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("
stone (2004-01-21 10:52:00) [5]
> между BeginTrans и CommitTrans
Извиняюсь!!!
между BeginTrans и RollbackTrans конечно
stone (2004-01-21 10:51:00) [6]
> надо каждому свой ADOConnection ??
Нет как раз один для всех, при этом произойдет откат ВСЕХ действий между BeginTrans и CommitTrans
PS. Почитайте что-нибудь о транзакциях, многое станет ясно...
VladimirKVT (2004-01-21 10:40:00) [7]
> stone
У меня один ADOConnection используется для всех четырех SQL-запросов. Допустим два первых выполнились без ошибок, а третий - с ошибкой. Как мне тогда вернуть два первых в начальное состояние, видимо, если пользоваться Вашим кодом , то надо каждому свой ADOConnection ??
stone (2004-01-21 09:41:00) [8]
> VladimirKVT (21.01.04 08:58) [3]
> Плз. расскажите, покажите как из Дельфи работать с транзакциями
> SQL
ADOConnection.BeginTrans; // Начать транзакцию
try
... // Здесь делается Update/ Insert/ Delete
ADOConnection.CommitTrans; // Все нормально - подтверждаем
except
ADOConnection.RollbackTrans; // Ошибка - откатываем
end;
KSergey (2004-01-21 09:24:00) [9]
1.ADOConnection.BeginTrans/CommitTrans/RollbackTrans
2.Выполнять запросы "BEGIN TRANSACTION" и т.п.
VladimirKVT (2004-01-21 08:58:00) [10]
Плз. расскажите, покажите как из Дельфи работать с транзакциями SQL ???
KSergey (2004-01-21 08:52:00) [11]
Надо использовать транзакции.
ТОлько более правильно их использовать в рамках ХП на сервере. Причина - возможный порыв кабеля/завис клиентской машины, т.е. ситуации, когда обработка исключений не спасет, и транзакция намертво зависнет на сервере.
mtb (2004-01-21 08:14:00) [12]
Танзакции не работают?