Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Вопрос по SET XACT_ABORT ON  [new]
Gena928
Member

Откуда: Москва
Сообщений: 1139
День добрый,

есть кодик (выполнение хранимой процедуры много раз):
SET XACT_ABORT ON;

Execute proc_MyStoredProcedure(1);
Execute proc_MyStoredProcedure(2);
Execute proc_MyStoredProcedure(3);
Execute proc_MyStoredProcedure(4);
Execute proc_MyStoredProcedure(5);
Execute proc_MyStoredProcedure(6);
Execute proc_MyStoredProcedure(7);
Execute proc_MyStoredProcedure(8);
Execute proc_MyStoredProcedure(9);
.
.
.
Execute proc_MyStoredProcedure(100); 


Хранимка обновляет данные в текущей и соседней базе данных.
Правильно ли я понимаю, что если последнее выполнение хранимки выдаст ошибку, то все операции (включая в соседней базе) откатятся?
2 ноя 12, 09:30    [13412274]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SET XACT_ABORT ON  [new]
msLex
Member

Откуда:
Сообщений: 8240
Нет, конечно. У вас же транзакции нет.
2 ноя 12, 09:47    [13412371]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SET XACT_ABORT ON  [new]
Gena928
Member

Откуда: Москва
Сообщений: 1139
Получается вот так?

SET XACT_ABORT ON;

BEGIN TRANSACTION

Execute proc_MyStoredProcedure(1);
Execute proc_MyStoredProcedure(2);
Execute proc_MyStoredProcedure(3);
Execute proc_MyStoredProcedure(4);
Execute proc_MyStoredProcedure(5);
Execute proc_MyStoredProcedure(6);
Execute proc_MyStoredProcedure(7);
Execute proc_MyStoredProcedure(8);
Execute proc_MyStoredProcedure(9);
.
.
.
Execute proc_MyStoredProcedure(100); 
COMMIT TRANSACTION;
2 ноя 12, 10:05    [13412497]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SET XACT_ABORT ON  [new]
invm
Member

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

Смотря какая ошибка. Если пользовательская, то ничего не откатится.
2 ноя 12, 10:32    [13412642]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SET XACT_ABORT ON  [new]
Gena928
Member

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

Не, там куча проверок и если данные не находятся то я вызываю RAISERROR('SOME MESSAGE', 16, 1)
2 ноя 12, 10:36    [13412668]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SET XACT_ABORT ON  [new]
iap
Member

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

а поэкспериментировать что мешает?
2 ноя 12, 10:40    [13412705]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SET XACT_ABORT ON  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
Gena928
invm,

Не, там куча проверок и если данные не находятся то я вызываю RAISERROR('SOME MESSAGE', 16, 1)
Это и есть пользовательская ошибка.
2 ноя 12, 10:54    [13412786]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SET XACT_ABORT ON  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
> Не, там куча проверок и если данные не находятся то я вызываю RAISERROR('SOME MESSAGE', 16, 1)

именно это и называется "пользовательской" ошибкой.
2 ноя 12, 10:55    [13412790]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SET XACT_ABORT ON  [new]
Gena928
Member

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

ок, спасибо.
буду экспериментировать с TRY .. Catch.
2 ноя 12, 10:56    [13412794]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SET XACT_ABORT ON  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1437
пользовательские ошибки нужно дополнительно проверять
............
exec dbo.SomeProc
if @@ERROR <> 0
begin
  rollback tran
  return
end
............
2 ноя 12, 12:14    [13413459]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SET XACT_ABORT ON  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Zelius
пользовательские ошибки нужно дополнительно проверять
............
exec dbo.SomeProc
if @@ERROR <> 0
begin
  rollback tran
  return
end
............
Если между RAISERROR и RETURN из процедуры попадется хоть одна команда, то @@ERROR обнулится и никакой ошибки вы не поймаете. Так что весьма опасный способ.
Лучше уж делать RETURN -1 из процедуры, а потом проверять это значение.
2 ноя 12, 20:50    [13416802]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SET XACT_ABORT ON  [new]
Crimean
Member

Откуда:
Сообщений: 13148
версия сервера? если 12, может, THROW?
2 ноя 12, 21:16    [13416867]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SET XACT_ABORT ON  [new]
SirMix
Member

Откуда: Киев
Сообщений: 79
я использовал вот так:

BEGIN TRY
	
	SET XACT_ABORT ON;
	BEGIN TRANSACTION
	
		EXEC [dbo].[Update1] @Date = @Date 
		EXEC [dbo].[Update2] @Date = @Date 
		EXEC [dbo].[Update3] @Date = @Date 
		EXEC [dbo].[Update4] @Date = @Date 
		EXEC [dbo].[Update5] @Date = @Date 
	
	COMMIT TRANSACTION

END TRY
BEGIN CATCH
	
	--<some operations>
	ROLLBACK TRANSACTION

END CATCH


при падении любого апдейта - откатывает все предыдущие.
5 ноя 12, 15:47    [13422747]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SET XACT_ABORT ON  [new]
Crimean
Member

Откуда:
Сообщений: 13148
SirMix,

боюсь, для этого варианта:

Gena928
invm,

Не, там куча проверок и если данные не находятся то я вызываю RAISERROR('SOME MESSAGE', 16, 1)


все равно будет "мимо кассы"
5 ноя 12, 15:56    [13422786]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SET XACT_ABORT ON  [new]
SirMix
Member

Откуда: Киев
Сообщений: 79
Crimean,

та в принципе должно откатить все...
я когда-то тестил - откатывало... единственное что - если нужно ошибку "словить" и залогировать, то до вызова ROLLBACK я запихивал кажись в таблицную переменную ее значение - транзакция не откатывает это, насколько я помню...
5 ноя 12, 17:32    [13423080]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SET XACT_ABORT ON  [new]
Crimean
Member

Откуда:
Сообщений: 13148
SirMix,

ой. туплю. понедельник. с TRY/CATCH - конечно все сработает. главное severity "информационное" не ставить
5 ноя 12, 17:53    [13423142]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SET XACT_ABORT ON  [new]
SirMix
Member

Откуда: Киев
Сообщений: 79
Crimean,

та да, понедельник это всегда тяжело...))
я просто вызываю встроенную ERROR_SEVERITY() для TRY..CATCH.
а что значит "информационную" и на что это может повлиять? это имеется ввиду значения от 19 до 25, которые доступны только для группы sysadmin?
5 ноя 12, 18:13    [13423211]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SET XACT_ABORT ON  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
SirMix
а что значит "информационную" и на что это может повлиять? это имеется ввиду значения от 19 до 25, которые доступны только для группы sysadmin?
Имеется в виду severity меньше 11.
5 ноя 12, 19:26    [13423361]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SET XACT_ABORT ON  [new]
SirMix
Member

Откуда: Киев
Сообщений: 79
invm,

спс, как-то что-то это подзабыл слегка...
5 ноя 12, 19:28    [13423368]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SET XACT_ABORT ON  [new]
ВасисуалийЛоханкин
Guest
Не хочу делать новую тему. Разъясните, пожалуйста, студенту за xact_abort.

if object_id('XactAbortTestTable') > 0 drop table  XactAbortTestTable 
GO
create table XactAbortTestTable (F int)

GO

if object_id('XactAbortTst') > 0 drop proc  XactAbortTst
GO
create proc XactAbortTst @P int 
as
begin
  insert into XactAbortTestTable select @p  
  if @P = 666 select 1/0 
end 


GO
if object_id('XactAbortTst2') > 0 drop proc  XactAbortTst2 
GO 
create proc XactAbortTst2 
as
begin
  SET XACT_ABORT ON
  exec XactAbortTst 1
  exec XactAbortTst 2
  exec XactAbortTst 666
end 

GO

exec  XactAbortTst2 

select * from XactAbortTestTable /* <-- 0_o  ?!?!?! */



Также подскажите, как обычно решается два вида таких задач:
1 - хранимки выполняются одна за другой, и в случае ошибки мне надо откатить ВСЕ изменения
2 - хранимки выполняются одна за другой, и в случае ошибки мне надо продолжить выполнять пакет, игнорируя то, что не сработало
30 июл 13, 10:25    [14635827]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SET XACT_ABORT ON  [new]
Гость333
Member

Откуда:
Сообщений: 3683
ВасисуалийЛоханкин,

Хорошая попытка, я почти повёлся ;-)
exec  XactAbortTst2 
GO
select * from XactAbortTestTable /* <-- 0_o  ?!?!?! */


ВасисуалийЛоханкин
1 - хранимки выполняются одна за другой, и в случае ошибки мне надо откатить ВСЕ изменения

Так вроде было: 13422747

ВасисуалийЛоханкин
2 - хранимки выполняются одна за другой, и в случае ошибки мне надо продолжить выполнять пакет, игнорируя то, что не сработало

Например, вызов каждой процедуры обернуть в TRY-CATCH и транзакцию.
30 июл 13, 10:41    [14635931]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SET XACT_ABORT ON  [new]
ВасисуалийЛоханкин
Guest
Попытка чего?

GO

exec  XactAbortTst2 

GO 

select * from XactAbortTestTable /* <-- 0_o  */



1
2
666
30 июл 13, 10:53    [14636010]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SET XACT_ABORT ON  [new]
ВасисуалийЛоханкин
Guest
автор
Так вроде было: 13422747

Вот же мой тест кейс, все инсерты проходят, хотя ожидается, что XACT_ABORT ON + эррор в одной из проц должны откатить все.

Или я не понял как должен работать XACT_ABORT ?
30 июл 13, 10:55    [14636025]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SET XACT_ABORT ON  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
ВасисуалийЛоханкин,

транзакция-то где? в одной процедуре - еще не значит в одной транзакции.
30 июл 13, 10:59    [14636047]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SET XACT_ABORT ON  [new]
Гость333
Member

Откуда:
Сообщений: 3683
ВасисуалийЛоханкин
Попытка чего?

Ок, тогда поясните, что вы хотели показать вашим примером.

ВасисуалийЛоханкин
Вот же мой тест кейс, все инсерты проходят, хотя ожидается, что XACT_ABORT ON + эррор в одной из проц должны откатить все.

В том примере открывается явная транзакция, а в вашем — нет. У вас все вставки выполняются в неявных транзакциях, которые тут же и коммитятся. Поэтому ошибка деления на ноль на эти транзакции не влияет.
30 июл 13, 11:00    [14636058]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить