Форум: "Базы";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];
ВнизКак правильно и/или лучше сделать откат? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c