Согласно msdn: синтаксис фиксации:
Однако, когда я пропускаю tran / transaction слов - он компилируется и запускается без ошибок.
tran
transaction
Как это может работать?
Вместо этого он делает что-то еще?
Данный коммит на самом деле не является коммитом, как вы думаете.См. COMMIT WORK
COMMIT [WORK] [;] Замечания Этот оператор работает так же, как COMMIT TRANSACTION, за исключением того, что COMMIT TRANSACTION принимает пользовательское имя транзакции.Этот синтаксис COMMIT, с указанием или без указания необязательного ключевого слова WORK, совместим с SQL-92.
COMMIT [WORK] [;]
Замечания
Этот оператор работает так же, как COMMIT TRANSACTION, за исключением того, что COMMIT TRANSACTION принимает пользовательское имя транзакции.Этот синтаксис COMMIT, с указанием или без указания необязательного ключевого слова WORK, совместим с SQL-92.
Так что COMMIT сам по себе равен COMMIT WORK, что идентично COMMIT TRANSACTION. То же самое для ROLLBACK [ WORK ]
COMMIT
COMMIT WORK
COMMIT TRANSACTION
ROLLBACK [ WORK ]
После комментария
BEGIN TRANSACTION gbn SELECT 1 COMMIT gbn -- fail GO BEGIN TRANSACTION gbn SELECT 2 COMMIT TRAN gbn -- works GO
IF @@TRANCOUNT > 0 нацелен на проверку наличия (как минимум) одной ожидающей транзакции - если его необходимо использовать как с ROLLBACK, так и с COMMIT, так как выполнение этих инструкций без открытия какой-либо транзакции приведет к ошибке
IF @@TRANCOUNT > 0
ROLLBACK