Мне еще многое предстоит узнать о T-SQL, но при разработке некоторого кода для транзакции (и на основе кода на примерах из stackoverflow и других сайтов) я обнаружил случай, когда кажется, что точка с запятой необходима отсутствует, оператор, кажется, не выполняется вообще и не возникает ошибка. Это, кажется, не охвачено ни в одном из приведенных выше ответов. (Это было с использованием MS SQL Server 2012.)
После того, как транзакция заработала так, как я хотел, я решил применить к ней триггер-попытку, чтобы при наличии ошибок он был откатан. Только после этого транзакция не была зафиксирована (SSMS подтверждает это при попытке закрыть окно с хорошим сообщением, предупреждающим вас о факте незафиксированной транзакции.
Итак, это
COMMIT TRANSACTION
вне блока BEGIN TRY / END TRY работал нормально для фиксации транзакции, но внутри блока это должно было быть
COMMIT TRANSACTION;
Обратите внимание, что нет сообщений об ошибках или предупреждений, а также указаний на то, что транзакция все еще не завершена, пока не будет предпринята попытка закрыть вкладку запроса.
К счастью, это вызывает такую огромную проблему, что сразу становится очевидно, что есть проблема. К сожалению, поскольку не сообщается об ошибке (синтаксис или иное), не сразу было понятно, в чем проблема.
В противоположность этому, ROLLBACK TRANSACTION работает одинаково хорошо в блоке BEGIN CATCH с точкой с запятой или без нее.
Может быть, в этом есть какая-то логика, но она кажется произвольной и «Алиса в стране чудес».