Откат и Raiseerror, какой первый?

Иногда я выполняю следующий набор утверждений в следующем порядке:

Raiseerror(...)
Rollback;

но мне интересно, если это вызывает тот же эффект, как показано ниже:

Rollback;
Raiseerror(...)

Я понимаю, что они одинаковы и вызывают одинаковый эффект. Сначала выполняется откат, после выполнения он продолжает выполнение в следующей строке, то есть Raiseerrror(...)

Кто-нибудь может это подтвердить? или предпочтительнее выполнить этот набор утверждений конкретным образом?

1 ответ

Решение

Было бы важно, если бы вы были в блоке TRY-CATCH - raiserror перенаправлял бы выполнение на блок catch, поэтому, если после него произошел откат (в блоке try), он не был бы выполнен.

Также это будет зависеть от серьезности ошибки - серьезность 20+ прерывает соединение с базой данных.

Хороший шаблон для использования это что-то вроде

begin try
    begin transaction;

    -- do stuff

    commit transaction;
end try
begin catch
    declare @ErrorMessage nvarchar(max), 
        @ErrorSeverity int, 
        @ErrorState int;

    select @ErrorMessage = ERROR_MESSAGE() + ' Line ' + cast(ERROR_LINE() as nvarchar(5)), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE();

    if @@trancount > 0
        rollback transaction;

    raiserror (@ErrorMessage, @ErrorSeverity, @ErrorState);
end catch
Другие вопросы по тегам