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

Вниз

Обработка ошибки при разрыве связи   Найти похожие ветки 

 
Tornado ©   (2006-01-25 17:00) [0]

Есть прога работающая по сети с БД MS SQL Server. Компоненты ADOConnection+ADODataSet. При добавлении новой записи иногда в этой самой сети случаются затыки, редко но бывает. Если в процессе добавления записи возникает подробный затык в сети появляется ошибка (эта ситуация обработана и все нормально). Запись добавляется SQL-запросом, используются транзакции:


try
ADOConnection.BeginTrans;
Close;
SQL.Clear;
SQL.Add("INSERT INTO " + Reg.ReadString("Options", "tblShapkaName", "") + " (YEAR_IZM, LPUMG, STOIKANUM, NACHALNIK) VALUES (:YEAR_IZM, :LPUMG, :STOIKANUM, :NACHALNIK)");
Parameters.ParamByName("YEAR_IZM").Value := cbaddYear.Text;
Parameters.ParamByName("LPUMG").Value := "Один";
Parameters.ParamByName("STOIKANUM").Value :=cbaddStoikaNum.Text;
Parameters.ParamByName("NACHALNIK").Value := txtaddBoss.Text;
ExecSQL;

if ADOConnection.InTransaction = True then begin
ADOConnection.CommitTrans;  {успешное окончание транзакции}
   end
   else begin
      ADOConnection.RollbackTrans;
   end;

except
   ADOConnection.RollbackTrans;



Вообщем все хорошо, но если потом (после затыка) снова нажать кнопку "Добавить" под которой выполняется вышеприведенный код появляется ошибка: "В данном сеансе невозможен запуск дополнительных транзакций"

Вопрос как правильно обработать эту ошибку?


 
ЮЮ ©   (2006-01-26 03:22) [1]

if ADOConnection.InTransaction = True then begin
ADOConnection.CommitTrans;  {успешное окончание транзакции}
  end
  else begin
     ADOConnection.RollbackTrans;
  end;


И что здесь "откатывать", если не в транзакции? Тем более при чем здесь {успешное окончание транзакции}?

На мой взгляд, лучше так:

if not ADOConnection.InTransaction then ADOConnection.BeginTrans;
try
 ...
 ExecSQL;
 ADOConnection.CommitTrans;  
except
  ADOConnection.RollbackTrans;
end;

З.Ы. Зачем брать на себя управление транзакцией при вставке одной записи? Она и так либо вставится, либо - нет.


 
ЮЮ ©   (2006-01-26 04:15) [2]

Кстати , где здесь сабжевый "разрыв связи"?


 
Кто-то непонятный   (2006-01-26 06:19) [3]


> ЮЮ ©

Извеняюсь за офтоп, а при каких обстоятельствах следовало бы управлять трансзакциями?


 
ЮЮ ©   (2006-01-26 07:36) [4]

В том случае, естественно, когда изменеия должны касаться или всех (более 1-ой) или не одной записи.
Т.е. когда при возникновении хотя бы одной ошибке в пакете изменений всё откатывается назад


 
sniknik ©   (2006-01-26 08:56) [5]

уточнение
транзакции имеют смысл когда вставляются данные со связями/зависимые друг от друга/ссылающиеся т.е. такие которые одна часть без другой части ничего не значат или даже приводят к нарушению целостности данных.

к примеру данные накладной (внутренности) и ее заголовок (шапка) в другой таблице если он по логике программы формируется после "внутренностей". (работа то идет после по заголовкам и если его не будет то внутренности безсмыссленны их никто, никогде не увидит. а вот на формирования отчетов каких нибудь они повлиять могут, если будут совпадаюшие признаки по которым строится отчет ... получится логический трудноуловимый глюк (попробуй найти если это например только в годовом отчете "вылазит", и притом не в самой глючной программе, а в связаной куда та данные пересылает (там как раз потоварные сквозные отчеты независимые от "шапок" делаются)))

или нормализованные записи, т.е. когда одна логически неделимая запись лежит в нескольких таблицах, и запись только одной ее части будет неинформативен по крайней мере, либо будут опять теже глюки со связями.

а вот если записей пусть и много но они независимы ни от чего, то транзакция не нужна. к примеру делаеш начальное заполнение базы, справочник товаров, запись совершенно независимая (вообще это от логики структуры базы зависит, ну у нас считай так - независимая) и нафига тут транзакция которая откатит все заполнение при неправильных/сбойных данных  в например предпоследней записи (а их 170тыс ;)....? лучше уж глюк от этой записи пихнуть в лог и продолжить заполнение без всяких транзакций, в конце только выдать "были ошибки при заполнении - запись ..." пусть разбираются с каждой конкретной, а с программой в тоже время уже можно работать. (на "запусках" магазинов это ой как критично ;)

p.s. imho ADOConnection.BeginTrans; (и др.) лучше поменять на команды сервера "BEGIN TRANSACTION" и др. выполняемые в ADOCommand.


 
Tornado ©   (2006-01-26 10:40) [6]

спасибо всем, разобрался :)



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

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

Наверх




Память: 0.49 MB
Время: 0.028 c
1-1139816713
BanderLog
2006-02-13 10:45
2006.03.19
Отображение длительных процессов


11-1121271836
Dodfr
2005-07-13 20:23
2006.03.19
TabOrder form context menu error


6-1133428225
_PG_
2005-12-01 12:10
2006.03.19
Не могу понять-с клиента получаю сигнал а посланный с сервера нет


2-1141368131
dera
2006-03-03 09:42
2006.03.19
Как в TeeView узнать, что вибрана ветвь№1, а не ветвь№2?


15-1140978453
Volf_555
2006-02-26 21:27
2006.03.19
Какой посоветуете поставить форум в локальной сети?