Это неправильный подход - иметь предложение 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

0 ответов

Другие вопросы по тегам