处理SQL Server catch语句中的回滚

Iam*_*mIC 4 sql-server error-handling stored-procedures transactions

在我的阅读中,我在SQL Server存储过程的CATCH部分中看到了两种处理事务回滚的方法:

1: if @@trancount > 0 ROLLBACK
2: if XACT_STATE() <> 0 ROLLBACK TRAN
Run Code Online (Sandbox Code Playgroud)

哪个更好?为什么?

Ada*_*Dev 7

这个MSDN语言是一个很好的参考.引用:

XACT_STATE和@@ TRANCOUNT函数都可用于检测当前请求是否具有活动用户事务.@@ TRANCOUNT不能用于确定该交易是否已被归类为不可提交的交易.XACT_STATE不能用于确定是否存在嵌套事务.

假设您希望在某些情况下可能会委托交易,那么XACT_STATE将在此帮助您,因为这将确定是否可以提交,而@@ TRANCOUNT无法告诉您.如果你只是想做一个ROLLBACK,要么就能完成这项工作,所以这取决于你真正需要的是什么.