Nested try..catch & transactions

KI

Кто-то пробовал эти механизмы с открытыми транзакциями?У меня проблема со следующим скриптом(это пример илюстрирующий проблему).
BEGIN TRY
		BEGIN TRANSACTION t1;
			BEGIN TRY
				BEGIN TRANSACTION t2;
					raiserror('test',<b>16</b>,<b>1</b>,<b>1</b>)
				COMMIT TRANSACTION t2;
			END TRY
			BEGIN CATCH
				BEGIN

					SELECT XACT_STATE() as XACT_STATE,@@trancount as 'trcount',
					ERROR_NUMBER() AS ErrorNumber,
					ERROR_SEVERITY() AS ErrorSeverity,
					ERROR_STATE() AS ErrorState,
					ERROR_PROCEDURE() AS ErrorProcedure,
					ERROR_LINE() AS ErrorLine,
					ERROR_MESSAGE() AS ErrorMessage

					ROLLBACK TRANSACTION t2
				END;
			end catch

		COMMIT TRANSACTION t1;
	END TRY
BEGIN CATCH
	BEGIN
		SELECT XACT_STATE() as XACT_STATE,@@trancount as 'trcount',
		ERROR_NUMBER() AS ErrorNumber,
		ERROR_SEVERITY() AS ErrorSeverity,
		ERROR_STATE() AS ErrorState,
		ERROR_PROCEDURE() AS ErrorProcedure,
		ERROR_LINE() AS ErrorLine,
		ERROR_MESSAGE() AS ErrorMessage

		ROLLBACK TRANSACTION t1
	END;
end catch
П.С.Может этот нюанс указан в BOL в этих строках:A TRY…CATCH construct cannot span multiple batches. A TRY…CATCH construct cannot span multiple blocks of Transact-SQL statements. For example, a TRY…CATCH construct cannot span two BEGIN…END blocks of Transact-SQL statements and cannot span an IF…ELSE construct.Я просто не доганяю что они тут хотят сказать. Может ктото объяснит? :-)
9 ответов

KI

begin/end уберите в catch-блоке.


KI

Перевод BOL: Конструкция TRY...CATCH может быть вложенной. Либо блок TRY, либо блок CATCH могут содержать вложенные конструкции TRY...CATCH. Например, блок CATCH может содержать внутри себя внедренную TRY...CATCH для управления ошибками, возникающими в коде CATCH.Это где вы так научились писать? Примеры в BOL смотрели?


KI

begin/end уберите в catch-блоке.
Как я понимаю, это для красоты :-)Убрал, ошибка из внешнего catch осталась.Сорри, я не указал сразу ошибку:Cannot roll back t2. No transaction or savepoint of that name was found.Т.е. второй catch пробует откатить транзакцию из внутреннего блока, которая уже была отменена во внутреннем блоке.


KI

Перевод BOL: Конструкция TRY...CATCH может быть вложенной. Либо блок TRY, либо блок CATCH могут содержать вложенные конструкции TRY...CATCH. Например, блок CATCH может содержать внутри себя внедренную TRY...CATCH для управления ошибками, возникающими в коде CATCH.Это где вы так научились писать? Примеры в BOL смотрели?
А чего она не может "cannot span multiple batches"? Что тут они хотели сказать??Просто интересно, это баг или я чтото упустил.


KI

очевидно в одном пакете должны быть, go между TRY...CATCH не должно быть


KI

BEGIN TRY
		BEGIN TRANSACTION t1
			BEGIN TRY
				BEGIN TRANSACTION t2
					SAVE TRAN t2
					raiserror('test',<b>16</b>,<b>1</b>,<b>1</b>)
				COMMIT TRANSACTION t2
			END TRY
			BEGIN CATCH
					SELECT XACT_STATE() as XACT_STATE,@@trancount as 'trcount',
					ERROR_NUMBER() AS ErrorNumber,
					ERROR_SEVERITY() AS ErrorSeverity,
					ERROR_STATE() AS ErrorState,
					ERROR_PROCEDURE() AS ErrorProcedure,
					ERROR_LINE() AS ErrorLine,
					ERROR_MESSAGE() AS ErrorMessage

					ROLLBACK TRANSACTION t2
			END CATCH

		COMMIT TRANSACTION t1
	END TRY
BEGIN CATCH
		SELECT XACT_STATE() as XACT_STATE,@@trancount as 'trcount',
		ERROR_NUMBER() AS ErrorNumber,
		ERROR_SEVERITY() AS ErrorSeverity,
		ERROR_STATE() AS ErrorState,
		ERROR_PROCEDURE() AS ErrorProcedure,
		ERROR_LINE() AS ErrorLine,
		ERROR_MESSAGE() AS ErrorMessage

		ROLLBACK TRANSACTION t1
END CATCH
У меня вот так работает. В ошибке говорится, что нет транзакции или точки сохранения. Ну я точку сохранения и создал (SAVE TRAN t2).


KI

У меня вот так работает. В ошибке говорится, что нет транзакции или точки сохранения. Ну я точку сохранения и создал (SAVE TRAN t2).
Сенкс, так действительно работает. Но мене кажется это бага :-))


KI

> Но мене кажется это бага :-))в rollback tran можно указывать имя только самой внешнейтранзакции. по крайней мере, в 2000-ом так было. и это документировано.не думаю, что в 2005 что-то изменилось...


KI

> Но мене кажется это бага :-))в rollback tran можно указывать имя только самой внешнейтранзакции. по крайней мере, в 2000-ом так было. и это документировано.не думаю, что в 2005 что-то изменилось... Posted via ActualForum NNTP Server 1.3
Точно, спасибо.