Я пытаюсь написать MS sql script, который имеет транзакцию и блок try/catch. Если он получает исключение, транзакция откатывается. Если нет, транзакция совершается. Я видел несколько разных сайтов, говорящих так:
begin transaction
begin try
--main content of script here
end try
begin catch
rollback transaction
end catch
commit transaction
Но разве мы не будем ударять по строке "commit transaction" даже в случае обнаружения исключения? Не приведет ли это к ошибке SQL, потому что транзакция уже откатна? Я думаю, это должно быть сделано следующим образом:
declare @success bit = 1
begin transaction
begin try
--main content of script here
end try
begin catch
rollback transaction
set @success = 0
end catch
if(@success = 1)
begin
commit transaction
end
Как правило, общедоступное решение не включает переменную @success? Нет ли ошибки sql, которая происходит в результате совершения транзакции, которая уже откатна? Я неверно говорю, что строка "совершить транзакцию" первого примера кода будет по-прежнему ударяться в случае обнаружения исключения?