Наконец, пункт в транзакции SQL Server? Что-то, что будет выполняться независимо от успеха или неудачи?

В SQL Server есть что-то похожее на finally пункт в try..catch... блок с #?

Я имею в виду, я использую BEGIN TRAN, END TRAN, COMMIT TRAN, ROLLBACK TRAN и т.д. в транзакции SQL Server и хотите раздел или некоторый набор действий, которые должны запускаться независимо от успеха, сбоя или транзакции.

Есть ли решение для этого? (похоже на блок finally на try/catch языков OOPS).

заранее спасибо

3 ответа

Там нет ничего, что будет работать "независимо от успеха или неудачи" со 100% надежностью. Неважно, говорите ли вы о предложении "finally" программы на C# или о структуре BEGIN TRY...END TRY BEGIN CATCH...END CATCH на SQL Server.

Проблема в том, что подобные терминальные блоки не могут работать при каждом возможном режиме отказа. Каждый возможный режим сбоя должен включать программные, аппаратные и сетевые сбои. Если вашим клиентом является правительство, оно, вероятно, должно включать и ракетные атаки.

Обязательная ссылка на классический TheDailyWTF.

На самом деле, есть BEGIN TRY... END TRY...BEGIN CATCH... END CATCH структура в SQL Server. Я использую это довольно часто.

Вот обзор - бит выбора информации об ошибке, конечно, необязателен - делайте то, что имеет смысл в вашем случае.

BEGIN TRY
        -- do something here.

    /*  Following line can be used to force termination for testing purposes.
        No data changes will be committed.
    */
    --RAISERROR('testing', 99, 1);

    PRINT 'Successful completion; committing transaction.';
    COMMIT TRAN;
END TRY
BEGIN CATCH
    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;

    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;
    RAISERROR(N'Error occurred; rolling back and terminating.',18,1);
END CATCH;

Этот последний вызовет ошибку каждый раз, не так ли?

Если вы хотите перехватить ошибку отката - вам нужно также поместить ее в блок try..except.

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