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

Откуда: г. Калуга
Сообщений: 1209
Вот код из хелпа
IF OBJECT_ID(N't2', N'U') IS NOT NULL
    DROP TABLE t2;
GO
IF OBJECT_ID(N't1', N'U') IS NOT NULL
    DROP TABLE t1;
GO
CREATE TABLE t1
    (a INT NOT NULL PRIMARY KEY);
CREATE TABLE t2
    (a INT NOT NULL REFERENCES t1(a));
GO
INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (3);
INSERT INTO t1 VALUES (4);
INSERT INTO t1 VALUES (6);
GO
SET XACT_ABORT OFF;
GO
BEGIN TRANSACTION;
INSERT INTO t2 VALUES (1);
INSERT INTO t2 VALUES (2); -- Foreign key error.
INSERT INTO t2 VALUES (3); -- Эта команда выполняется!
COMMIT TRANSACTION;
GO
SELECT *
    FROM t2; -- две строки 1 и 3, как и ожидалось
GO


вот мой код
GO
SET XACT_ABORT off;
GO
 
begin transaction;
insert into waregroups values(154, 'test', 0, 0, 0);
select * from waregroups where code = 154;	--результат есть
update Stat set ConfigVersion = 'qwewrt' where ID = 1;	-- тут ошибка	 преобразования значения varchar "qwewrt" в тип данных int.
select * from waregroups where code = 154; -- запрос не обрабатывается
commit transaction;

go
select * from waregroups where code = 154; -- результат пустой


Я глаза сломал уже, не вижу принципиальной разницы. В Справке написано
Если выполнена инструкция SET XACT_ABORT OFF, в некоторых случаях выполняется откат только вызвавшей ошибку инструкции языка Transact-SQL, а обработка транзакции продолжается. В зависимости от серьезности ошибки возможен откат всей транзакции при выполненной инструкции SET XACT_ABORT OFF

Итак вроде уровень ошибки в обоих примера одинаковый.
И еще попутно вопрос в продолжение этой же темы, может кто подскажет. С таким поведением я столкнулся в программе, соеденение с сервером через ADOConnection.
код такой
Connection.BeginTrans;
....
// Тот же ошибочный запрос
try
  qryTest.SQL.Add('update Stat set ConfigVersion = ''qwewrt'' where ID = 1');  
  qryTest.ExecSQL;
  Connection.CommitTrans;
except
  // тут Connection.InTransaction = true Почему TRUE, если она откатиться должна согласно приведенному выше примеру???? Перезапуск???
  Connection.RollBackTrans;
end
25 янв 17, 10:13    [20143044]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка внутри транзакции и откат  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
minva,

у вас там XACT_STATE = -1 по этому только полный откат или TRY CATCH
25 янв 17, 10:22    [20143084]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка внутри транзакции и откат  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1209
TaPaK,
спасибо понял, а внешне никак отличить такие вещи нельзя, т.е. будет откат или нет? Глядя на сообщение об ошибке
Сообщение 245, уровень 16, состояние 1, строка 1
Ошибка преобразования значения varchar "qwewrt" в тип данных int.
25 янв 17, 10:33    [20143153]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка внутри транзакции и откат  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
minva,

IF (XACT_STATE()) = -1
25 янв 17, 10:36    [20143165]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка внутри транзакции и откат  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1209
TaPaK, я так и сделал, это то понятно.
Я имею ввиду, что чисто по сообщению об ошибке определить, как поведет себя транзакция не получится?
25 янв 17, 10:43    [20143207]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка внутри транзакции и откат  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
minva,

вы собираетесь определять ошибку до её появления?
25 янв 17, 10:56    [20143293]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка внутри транзакции и откат  [new]
invm
Member

Откуда: Москва
Сообщений: 9688
minva,

Есть ошибки statement-abortion и batch-abortion.
Batch-abortion откатывают транзакцию, вне зависимости от значения XACT_ABORT.
http://www.sommarskog.se/error-handling-I.html
Error Aborts
Duplicate primary key. Statement
NOT NULL violation. Statement
Violation of CHECK or FOREIGN KEY constraint. Statement
Most conversion errors, for instance conversion of non-numeric string to a numeric value. BATCH
Attempt to execute non-existing stored procedure. Statement
Missing or superfluous parameter to stored procedure to a procedure with parameters. Statement
Superfluous parameter to a parameterless stored procedure. BATCH
Exceeding the maximum nesting-level of stored procedures, triggers and functions. BATCH
Being selected as a deadlock victim. BATCH
Permission denied to table or stored procedure. Statement
ROLLBACK or COMMIT without any active transaction. Statement
Mismatch in number of columns in INSERT-EXEC. BATCH
Declaration of an existing cursor Statement
Column mismatch between cursor declaration and FETCH statement. Statement.
Running out of space for data file or transaction log. BATCH
25 янв 17, 11:17    [20143391]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка внутри транзакции и откат  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1209
TaPaK,
блин... Вот я не знал до обращения сюда про XACT_STATE. У меня были только два сообщения об ошибке, в одном примере и другом.
Уровень (level) у обоих 16, состояние(state) в примере иp хелпа 0, в моем примере 1.
Вот я и спрашиваю, можно было ли только из сообщения выяснить поведение транзакции
еще раз из хелпа "В зависимости от серьезности ошибки..."
Почему уровень обоих ошибок тогда одинаковый?
25 янв 17, 11:20    [20143409]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка внутри транзакции и откат  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1209
invm, все, понял, спасибо
25 янв 17, 11:22    [20143419]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить