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

Откуда: Киев
Сообщений: 79
добрый день всезнающий олл!)

суть вопроса следующая - есть такая конструкция:

MainStoredProc
as
begin

begin try

begin transaction
exec Proc1
exec Proc2
exec Proc3
commit transaction

end try

begin catch
if @@TRANCOUNT >=1
rollback transaction
end catch

end

- при "падении" Proc3 - откат пройдет по всем процедурам транзакции (откат Proc1, Proc2, Proc3) или же нет? В литературе как-то описано не совсем однозначно - решил спросить - может кто-то сталкивался?

спасибо за ответы.
11 апр 12, 12:49    [12398613]     Ответить | Цитировать Сообщить модератору
 Re: rollback transaction  [new]
Glory
Member

Откуда:
Сообщений: 104751
SirMix
В литературе как-то описано не совсем однозначно - решил спросить - может кто-то сталкивался?

BOL
ROLLBACK TRANSACTION
Rolls back an explicit or implicit transaction to the beginning of the transaction, or to a savepoint inside the transaction.
что же тут неоднозначного ?
beginning of the transaction у вас где находится ?
11 апр 12, 12:56    [12398682]     Ответить | Цитировать Сообщить модератору
 Re: rollback transaction  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Но есть же ещё XACT_ABORT
11 апр 12, 13:02    [12398731]     Ответить | Цитировать Сообщить модератору
 Re: rollback transaction  [new]
SirMix
Member

Откуда: Киев
Сообщений: 79
Glory
BOL
ROLLBACK TRANSACTION
Rolls back an explicit or implicit transaction to the beginning of the transaction, or to a savepoint inside the transaction.
что же тут неоднозначного ?
beginning of the transaction у вас где находится ?


спасибо.
начало транзакции у меня находится перед выполнением вложенных процерур, вопрос следующий - будет ли расти счетчик @@TRANCOUNT после выполнения кажой из них? или я принципиально не понимаю работу этого блока? если отвалится 3-я процедура - какое значение @@TRANCOUNT будет в тот момент?
11 апр 12, 13:04    [12398753]     Ответить | Цитировать Сообщить модератору
 Re: rollback transaction  [new]
SirMix
Member

Откуда: Киев
Сообщений: 79
iap
Но есть же ещё XACT_ABORT


хм... я думал использовать
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION
- это тоже откатит все ранее выполненные ХП?
11 апр 12, 13:06    [12398767]     Ответить | Цитировать Сообщить модератору
 Re: rollback transaction  [new]
Glory
Member

Откуда:
Сообщений: 104751
Опять отрываем хелп
Уже по @@TRANCOUNT

The BEGIN TRANSACTION statement increments @@TRANCOUNT by 1. ROLLBACK TRANSACTION decrements @@TRANCOUNT to 0, except for ROLLBACK TRANSACTION savepoint_name, which does not affect @@TRANCOUNT. COMMIT TRANSACTION or COMMIT WORK decrement @@TRANCOUNT by 1.
11 апр 12, 13:07    [12398783]     Ответить | Цитировать Сообщить модератору
 Re: rollback transaction  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
SirMix
iap
Но есть же ещё XACT_ABORT


хм... я думал использовать
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION
- это тоже откатит все ранее выполненные ХП?
SET XACT_ABORT { ON | OFF }

Читали?
SET XACT_ABORT OFF
Если выполнена инструкция SET XACT_ABORT OFF, в некоторых случаях выполняется откат только вызвавшей ошибку инструкции языка Transact-SQL, а обработка транзакции продолжается. В зависимости от серьезности ошибки возможен откат всей транзакции при выполненной инструкции SET XACT_ABORT OFF. OFF — установка по умолчанию.
11 апр 12, 13:11    [12398820]     Ответить | Цитировать Сообщить модератору
 Re: rollback transaction  [new]
SirMix
Member

Откуда: Киев
Сообщений: 79
iap
SirMix
пропущено...


хм... я думал использовать
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION
- это тоже откатит все ранее выполненные ХП?
SET XACT_ABORT { ON | OFF }

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


супер - спасибо за подсказку - думаю, это мне поможет!

еще раз спасибо!
11 апр 12, 13:24    [12398957]     Ответить | Цитировать Сообщить модератору
 Re: rollback transaction  [new]
SirMix
Member

Откуда: Киев
Сообщений: 79
SirMix
iap
пропущено...
SET XACT_ABORT { ON | OFF }

Читали?пропущено...


супер - спасибо за подсказку - думаю, это мне поможет!

еще раз спасибо!


обращусь еще раз за помощью... транзакция то откатывается, но вот мне нужно чтобы в таблицу лога сохранилась запись о том, что отвалилась главная ХП... скрипт ниже:
CREATE PROCEDURE dbo.testmain
AS
BEGIN
	DECLARE @StoredProcName NVARCHAR(200) = 'dbo.testmain'
	BEGIN TRY
		
		SET XACT_ABORT ON;
		BEGIN TRANSACTION
		
		EXEC dbo.tt1
		EXEC dbo.tt2
		EXEC dbo.tt3
		
		COMMIT TRANSACTION
	END TRY
	
	BEGIN CATCH
		DECLARE @StoredProcName NVARCHAR(200) = 'dbo.testmain'
		INSERT INTO dbo.TestLog (ActDate, ProcName)
		SELECT GETDATE(), @StoredProcName
	END CATCH
END


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

зарание благодарю за ответ.
12 апр 12, 11:15    [12404274]     Ответить | Цитировать Сообщить модератору
 Re: rollback transaction  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Рыть в сторону табличных переменных или сервис-брокера.
12 апр 12, 11:17    [12404292]     Ответить | Цитировать Сообщить модератору
 Re: rollback transaction  [new]
Glory
Member

Откуда:
Сообщений: 104751
SirMix
как я понял из описания, то "SET XACT_ABORT ON" завершает пакет, а потом его откатывает (тоесть вместе с блоком кетч...)

Пакет и транзакция - это разные вещи
SET XACT_ABORT действует на транзакции
12 апр 12, 11:20    [12404324]     Ответить | Цитировать Сообщить модератору
 Re: rollback transaction  [new]
SirMix
Member

Откуда: Киев
Сообщений: 79
Glory
SirMix
как я понял из описания, то "SET XACT_ABORT ON" завершает пакет, а потом его откатывает (тоесть вместе с блоком кетч...)

Пакет и транзакция - это разные вещи
SET XACT_ABORT действует на транзакции


не спорю, тогда, наверное, я не понимаю где тут транзакция... для меня это блок TRY...
12 апр 12, 11:23    [12404355]     Ответить | Цитировать Сообщить модератору
 Re: rollback transaction  [new]
SirMix
Member

Откуда: Киев
Сообщений: 79
Гавриленко Сергей Алексеевич
Рыть в сторону табличных переменных или сервис-брокера.


можно подробнее - как тут вывернуться с табличными переменными? что в них записывать и на каком этапе? и не откатится ли снова все?
12 апр 12, 11:24    [12404365]     Ответить | Цитировать Сообщить модератору
 Re: rollback transaction  [new]
Glory
Member

Откуда:
Сообщений: 104751
SirMix
не спорю, тогда, наверное, я не понимаю где тут транзакция... для меня это блок TRY...

Транзакция - это все, что между командами BEGIN TRAINSACTION - COMMIT/ROLLBACK TRAINSACTION
12 апр 12, 11:24    [12404370]     Ответить | Цитировать Сообщить модератору
 Re: rollback transaction  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
SirMix
Гавриленко Сергей Алексеевич
Рыть в сторону табличных переменных или сервис-брокера.


можно подробнее - как тут вывернуться с табличными переменными? что в них записывать и на каком этапе? и не откатится ли снова все?
Данные в табличны переменных не откатываются при откате транзакции. Пишите свой лог во временную таблицу, в конце, после завершения транзакции, пишите уже в лог.
12 апр 12, 11:25    [12404373]     Ответить | Цитировать Сообщить модератору
 Re: rollback transaction  [new]
SirMix
Member

Откуда: Киев
Сообщений: 79
Гавриленко Сергей Алексеевич
SirMix
пропущено...


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


можно плз ткнуть пальцем куда нужно вставить "после завершения транзакции, пишите уже в лог"?

вот скрипт - если вместо инсерта в лог поставить селект из табл переменной - оно выберет значения, но инсерт все-равно не проходит - что делаю не так?
CREATE PROCEDURE dbo.testmain1
AS
BEGIN
	DECLARE @StoredProcName NVARCHAR(200) = 'dbo.testmain'
	DECLARE @T TABLE (ActDate DATETIME, ProcName NVARCHAR(200))
	BEGIN TRY
		SET XACT_ABORT ON;
		BEGIN TRANSACTION
				
		EXEC dbo.tt1
		EXEC dbo.tt2
		EXEC dbo.tt3
		
		COMMIT TRANSACTION
	END TRY
	
	BEGIN CATCH
		INSERT INTO @T (ActDate, ProcName)
		SELECT GETDATE(), @StoredProcName
	END CATCH
	IF (SELECT COUNT(1) FROM @T) > 0
		BEGIN
			INSERT INTO dbo.TestLog (ActDate, ProcName)
			SELECT ActDate, ProcName FROM @T
		END
	ELSE PRINT 'Er'
END
12 апр 12, 11:46    [12404598]     Ответить | Цитировать Сообщить модератору
 Re: rollback transaction  [new]
SirMix
Member

Откуда: Киев
Сообщений: 79
понял!! спасибо за помощь! нужно было всего-то поставить роллбек после кетченд! спасибо Сергей Алексеевич!!!
12 апр 12, 11:48    [12404623]     Ответить | Цитировать Сообщить модератору
 Re: rollback transaction  [new]
Glory
Member

Откуда:
Сообщений: 104751
SirMix
но инсерт все-равно не проходит - что делаю не так?

Вы не можете определится - кто же все таки будет рулить транзакциями и порядком выполнения
То ли сервер через SET XACT_ABORT, то ли вы через TRY/CATCH
12 апр 12, 11:50    [12404635]     Ответить | Цитировать Сообщить модератору
 Re: rollback transaction  [new]
SirMix
Member

Откуда: Киев
Сообщений: 79
SirMix
понял!! спасибо за помощь! нужно было всего-то поставить роллбек после кетченд! спасибо Сергей Алексеевич!!!

вернее перед кетч енд)
12 апр 12, 11:50    [12404639]     Ответить | Цитировать Сообщить модератору
 Re: rollback transaction  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Какой инсетр куда не проходит? И "не проходит" - это текст ошибки?

Если вы хотите, чтобы у вас что-то не откатилось вместе с транзакцией, то это что-то надо записать сначала в табличную переменную, потом закомиттить или откатить транзакцию, а потом из табличной переменной записать ваше "что-то" куда вам нужно.
12 апр 12, 11:50    [12404641]     Ответить | Цитировать Сообщить модератору
 Re: rollback transaction  [new]
SirMix
Member

Откуда: Киев
Сообщений: 79
Glory
SirMix
но инсерт все-равно не проходит - что делаю не так?

Вы не можете определится - кто же все таки будет рулить транзакциями и порядком выполнения
То ли сервер через SET XACT_ABORT, то ли вы через TRY/CATCH


спасибо, уже разобрался. я откатываю в кетче транзакцию, а после кетча из табличной переменной вставляю данные
12 апр 12, 11:51    [12404652]     Ответить | Цитировать Сообщить модератору
 Re: rollback transaction  [new]
SirMix
Member

Откуда: Киев
Сообщений: 79
Гавриленко Сергей Алексеевич
Какой инсетр куда не проходит? И "не проходит" - это текст ошибки?

Если вы хотите, чтобы у вас что-то не откатилось вместе с транзакцией, то это что-то надо записать сначала в табличную переменную, потом закомиттить или откатить транзакцию, а потом из табличной переменной записать ваше "что-то" куда вам нужно.


уже все проходит - завтыкал заролбечить транзакцию в кетче - сорр, туплю...
12 апр 12, 11:52    [12404660]     Ответить | Цитировать Сообщить модератору
 Re: rollback transaction  [new]
Glory
Member

Откуда:
Сообщений: 104751
SirMix
я откатываю в кетче транзакцию

Вы как раз ничего не отменяете. Это делает сервер.
12 апр 12, 12:00    [12404721]     Ответить | Цитировать Сообщить модератору
 Re: rollback transaction  [new]
SirMix
Member

Откуда: Киев
Сообщений: 79
Glory
SirMix
я откатываю в кетче транзакцию

Вы как раз ничего не отменяете. Это делает сервер.


Глори, не хочу никого обидеть, но складывается такое впечатление, что Вы самоутверждаетесь тем, что постоянно пишете поучительные сообщения на форуме - Вас недооценивают в жизни? с какой целью Вы написали это сообщение?
фраза "я откатываю в кетче транзакцию" в момем понимании говорит о том, что у меня в процедуре "ROLLBACK TRANSACTION" стоит в блоке "CATCH" и все... что не понравилось?
12 апр 12, 12:11    [12404808]     Ответить | Цитировать Сообщить модератору
 Re: rollback transaction  [new]
Glory
Member

Откуда:
Сообщений: 104751
SirMix
Глори, не хочу никого обидеть, но складывается такое впечатление, что Вы самоутверждаетесь тем, что постоянно пишете поучительные сообщения на форум

Угадали
Лет 10 уже самоутверждаюсь
Последние пару дней никого подходящего не было, но на счастье пришли вы
Теперь моя жизнь прожита не зря.

SirMix
какой целью Вы написали это сообщение?
фраза "я откатываю в кетче транзакцию" в момем понимании говорит о том, что у меня в процедуре "ROLLBACK TRANSACTION" стоит в блоке "CATCH" и все... что не понравилось?

С той целью, что ваш код и ваши рассуждения о его работе очень сильно противоречат друг другу
Вы думаете, что написали управляемый код. Но это не так.
12 апр 12, 12:16    [12404838]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить