我了解SET XACT_ABORT命令的目的:
当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句引发运行时错误,则整个事务将终止并回滚。
当 SET XACT_ABORT 为 OFF 时,在某些情况下,只有引发错误的 Transact-SQL 语句被回滚并且事务继续处理。根据错误的严重程度,即使 SET XACT_ABORT 为 OFF,也可能回滚整个事务。关闭是默认设置。
一般来说,如果出现错误则希望继续处理事务的场景将超过出现错误时希望回滚整个事务的场景,因为我经常听到 DBA 和博客建议保持SET XACT_ABORT ON
避免遇到不一致的事务结果。我已经看到我们所有的存储过程也有SET XACT_ABORT ON
,作为模板代码的一部分。
问题:
如果大多数用例都需要
XACT_ABORT
,ON
那么会导致 SQL Server 将其默认OFF
为什么?是否会默认XACT_ABORT
为ON
SQL Server 事务处理增加任何开销?该
SET XACT_ABORT
命令仅影响当前会话。我知道我可以将 SSMS 默认设置为SET XACT_ABORT ON
fromSSMS > Tools > Options > Query Execution > SQL Server > Advanced
,如下图所示:但这仅限于通过 SSMS 运行的 SQL 语句,并且对通过应用程序代码/SSIS 包调用的存储过程没有帮助。对于这些程序,我仍然必须
SET XACT_ABORT ON
在每个程序中重复。有什么办法XACT_ABORT
可以ON
在数据库级别设置?还有其他方法可以设置XACT_ABORT
全局并且不必每次都担心吗?