Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.012 c
2-1141306640
K_Lock [D7, IB6.x]
2006-03-02 16:37
2006.03.19
UpdateError не вызывается


2-1140251747
WestBronx
2006-02-18 11:35
2006.03.19
GoTo


9-1126245342
Slavikk
2005-09-09 09:55
2006.03.19
Отстреливыемые предметы в glscene


2-1141218554
Yozj
2006-03-01 16:09
2006.03.19
как конструктору вернуть NUL?


4-1135697085
Nigel
2005-12-27 18:24
2006.03.19
LPT порт





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский