Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.01 c
7-39106
Администратор
2003-11-22 22:06
2004.02.13
CTRL+ALT+DELETE


14-39079
Rauf
2004-01-25 18:10
2004.02.13
Удаление программы самой из себя!


14-39000
Тимохов
2004-01-22 16:45
2004.02.13
Про горячие клавиши редактора Дельфи


1-38855
valerchik
2004-02-04 09:13
2004.02.13
динамическая загрузка форм


1-38924
Владимир В.
2004-02-04 12:00
2004.02.13
Эмуляция нажатия клавиши в активное окно





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский