【问题标题】:Why does SQL Server default XACT_ABORT to OFF? Can it be set to ON globally? [duplicate]为什么 SQL Server 默认 XACT_ABORT 为 OFF?可以全局设置为ON吗? [复制]
【发布时间】:2017-04-03 18:59:14
【问题描述】:

我理解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,作为模板代码的一部分。

问题:

  1. 如果大多数用例都要求 XACT_ABORTON,那么 SQL Server 将其默认为 OFF 的原因是什么?将XACT_ABORT 默认为ON 是否会增加 SQL Server 事务处理的开销?

  2. SET XACT_ABORT 命令仅影响当前会话。我知道我可以将 SSMS 从 SSMS > Tools > Options > Query Execution > SQL Server > Advanced 设为默认为 SET XACT_ABORT ON,如下图所示: 但这仅限于通过 SSMS 运行的 SQL 语句,对通过应用程序代码/SSIS 包调用的存储过程没有帮助。对于这些程序,我仍然必须在每个程序中重复 SET XACT_ABORT ON。有什么办法可以在数据库级别将XACT_ABORT 设置为ON?还有什么其他方法可以全局设置XACT_ABORT 并且不必每次都担心吗?

【问题讨论】:

标签: sql-server tsql transactions xact-abort


【解决方案1】:

您可以在服务器级别将XACT_ABORT ON 设置为全局默认连接设置,尽管该命令有点晦涩:

EXEC sys.sp_configure N'user options', N'16384'
GO
RECONFIGURE WITH OVERRIDE
GO

详情请见here

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 2020-08-04
    • 2020-08-26
    • 2014-12-23
    相关资源
    最近更新 更多