Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Insert в транзакции - странное поведение  [new]
Faso
Member

Откуда:
Сообщений: 26
Коллеги, приветствую!

Подскажите как такое возможно - есть запрос на инсерт в 3 таблицы в одной транзакции. Выполняется через адодб из 1с:

Соединение = Новый COMОбъект("ADODB.Connection");
СтрокаСоединения = "Provider=SQLOLEDB;" +
//"Integrated Security="""";" +
"Persist Security Info=False;" +
"User ID=" + НастройкиПодключения.ИмяПользователя + ";" +
"Password=" + НастройкиПодключения.ПарольПользователя + ";" +
"Initial Catalog=" + НастройкиПодключения.ИмяБазыДанных + ";" +
"Data Source=" + НастройкиПодключения.ИмяСервера + ";";
Соединение.ConnectionTimeOut = 360;
Соединение.CommandTimeOut = 360;
Соединение.CursorLocation = 2; //adUseServer

Периодически на выходе получаем записанную строку в первые 2 таблицы и незаписанную строку в 3-ю. Подскажите как отладить и где копать? Спасибо.

Текст запроса для примера:
begin tran
INSERT INTO O_JobList (idJob, EquipmentType, idStore, lSort, idZone, iRow, BarCode) VALUES ('11000051822013001', 'Штабелер', 'AST000046', 0, '000000006', '04', '')
INSERT INTO O_JobActions (idJob, iPos, idObject, ObjectName, QTYDoc, iPack, idSource, idReceiver) VALUES ('11000051822013001', 1, '', '', 569, 6, '0604-03-010', '0602-01-991')
INSERT INTO O_JobObjects (idJob, idObject, ObjectName, ObjectBarCode) VALUES ('11000051822013001', '', '', '10015949662254'), ('11000051822013001', '', '', '9785949662250'), ('11000051822013001', '', '', '9789851810334')
if @@ERROR=0
Commit tran
else
begin
Rollback tran
declare @msg varchar(50)
set @msg='Error №'+CAST(@@ERROR as varchar)
RAISERROR (@msg, 16,1)
end
14 янв 13, 21:50    [13769395]     Ответить | Цитировать Сообщить модератору
 Re: Insert в транзакции - странное поведение  [new]
sergei.mironenko
Member

Откуда:
Сообщений: 11
Faso,
автор
Because @@ERROR is cleared and reset on each statement executed, check it immediately following the statement validated, or save it to a local variable that can be checked later.

Таким образом, как у вас написано не совсем корректно -
if @@ERROR=0
будет проверять рез-т выполнения только:
INSERT INTO O_JobObjects (idJob, idObject, ObjectName, ObjectBarCode) VALUES ('11000051822013001', '', '', '10015949662254'), ('11000051822013001', '', '', '9785949662250'), ('11000051822013001', '', '', '9789851810334')
Таким образом если была ошибка в первых двух конструкциях, то проверка пройдет успешно и транзакция закоммититься (пройдет вставка только в 2 таблицы).

И вообще, если у Вас сервер выше 2000, то нужно использовать:
begin try
14 янв 13, 22:27    [13769472]     Ответить | Цитировать Сообщить модератору
 Re: Insert в транзакции - странное поведение  [new]
step_ks
Member

Откуда:
Сообщений: 936
SET XACT_ABORT
14 янв 13, 23:42    [13769653]     Ответить | Цитировать Сообщить модератору
 Re: Insert в транзакции - странное поведение  [new]
sergei.mironenko
Member

Откуда:
Сообщений: 11
step_ks
SET XACT_ABORT

Да, и если мы обернули в
TRY
, то в
CATCH
нужно еще будет проверить
XACT_STATE()
15 янв 13, 00:23    [13769770]     Ответить | Цитировать Сообщить модератору
 Re: Insert в транзакции - странное поведение  [new]
step_ks
Member

Откуда:
Сообщений: 936
автору этот TRY скорее всего нафиг не нужен в его случае.
15 янв 13, 11:04    [13770800]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить