Откат и 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