Этот MSDN articl e является хорошим справочным материалом. Цитата:
И XACT_STATE, и @@ TRANCOUNT
функции могут быть использованы для обнаружения
есть ли у текущего запроса
активная пользовательская транзакция. @@ TRANCOUNT
не может быть использован для определения
эта сделка была засекречена
как незафиксированная транзакция.
XACT_STATE не может быть использован для определения
есть ли вложенные транзакции.
Скажем, вы хотели потенциально совершить транзакцию в некоторых обстоятельствах, тогда XACT_STATE поможет вам здесь, поскольку это определит, можно ли совершить транзакцию или нет, тогда как @@ TRANCOUNT не может вам этого сказать. Если вы просто хотите выполнить ROLLBACK, то любой из них сделает эту работу, так что это зависит от того, что вам действительно нужно.