为什么SQL Server默认XACT_ABORT为OFF?它可以全局设置为ON吗?

10
我理解 SET XACT_ABORT 命令的用途:

当 SET XACT_ABORT 设置为 ON 时,如果 Transact-SQL 语句引发运行时错误,则整个事务将终止并回滚。

当 SET XACT_ABORT 设置为 OFF 时,在某些情况下仅回滚引发错误的 Transact-SQL 语句,并继续处理事务。根据错误的严重性,即使 SET XACT_ABORT 设置为 OFF,整个事务也可能被回滚。OFF 是默认设置。

通常情况下,希望在出现错误时继续处理事务的场景比需要出现错误时回滚整个事务的场景要少得多,因此我经常听到 DBA 和博客建议将 SET XACT_ABORT ON 以避免产生不一致的事务结果。我看到我们所有的存储过程都包含了 SET XACT_ABORT ON,作为模板代码的一部分。

问题:

  1. 如果大多数使用情况需要将 XACT_ABORT 设为 ON,那么是什么导致 SQL Server 将其默认设为 OFF?将 XACT_ABORT 默认设为 ON 是否会增加 SQL Server 事务处理的开销?

  2. SET XACT_ABORT 命令只影响当前会话。我知道可以通过在 SSMS > 工具 > 选项 > 查询执行 > SQL Server > 高级 中设置使 SSMS 默认将 SET XACT_ABORT ON,如下图所示: enter image description here

但是这仅适用于通过SSMS运行的SQL语句,并且无法帮助通过应用程序代码/SSIS包调用的存储过程。对于这些存储过程,我仍然需要在每个存储过程中重复使用SET XACT_ABORT ON。是否有任何方法可以在数据库级别设置XACT_ABORTON?还有其他全局设置XACT_ABORT的方法,而不必每次都担心它?

您可以在任何时候通过活动连接发出 SET XXX ON/OFF 命令,并且该选项将应用于整个会话。 - Alex K.
为什么SET XACT_ABORT默认不开启? - Alex K.
1个回答

8
你可以在服务器级别将XACT_ABORT ON设置为全局默认连接设置,尽管该命令有些晦涩。
EXEC sys.sp_configure N'user options', N'16384'
GO
RECONFIGURE WITH OVERRIDE
GO

请点击这里查看详情。

该选项也可通过SSMS对象资源管理器>服务器属性>连接设置:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接