Это неправильный подход - иметь предложение BEGIN TRANSACTION внутри блока BEGIN TRY?
Я хочу откатить транзакцию после обнаружения ошибки в моем SP, поэтому я нашел здесьTRANSACTION
блок должен идти внутрь TRY
блок.
Однако, когда я запускаю этот пример, я получаю:
Msg 6401, Level 16, State 1, Line 16
Cannot roll back MYTRAN. No transaction or savepoint of that name was found.
Интересно, если этот подход является правильным или обратным, я имею в виду TRY
блок должен идти внутрь TRANSACTION
блок.
редактировать
Я выполняю очень похожий запрос, используемый в ссылке выше.
Но на всякий случай код
BEGIN TRY
BEGIN TRANSACTION MYTRAN; -- Give the transaction a name
SELECT 1/0 -- Generates divide by zero error causing control to jump into catch
PRINT '>> COMMITING'
COMMIT TRANSACTION MYTRAN;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
PRINT '>> ROLLING BACK'
ROLLBACK TRANSACTION MYTRAN; -- The semi-colon is required (at least in SQL 2012)
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage
END
END CATCH