Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно и/или лучше сделать откат? [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]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо