繁体   English   中英

为什么SQL Server默认XACT_ABORT为OFF?可以在全球设置为ON吗? [重复]

[英]Why does SQL Server default XACT_ABORT to OFF? Can it be set to ON globally? [duplicate]

这个问题在这里已有答案:

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

Quesions:

  1. 如果大多数用例需要XACT_ABORTON ,那么会导致SQL Server将其默认为OFF 默认XACT_ABORTON会给SQL Server事务处理增加任何开销吗?

  2. SET XACT_ABORT命令仅影响当前会话。 我知道我可以通过SSMS > Tools > Options > Query Execution > SQL Server > Advanced使SSMS默认为SET XACT_ABORT ON ,如下图所示: 在此输入图像描述 但这仅限于通过SSMS运行的SQL语句,并且对通过应用程序代码/ SSIS包调用的存储过程没有帮助。 对于那些程序,我仍然需要在每个过程中重复SET XACT_ABORT ON 有没有办法在数据库级别将XACT_ABORT设置为ON 我可以在全球范围内设置XACT_ABORT以及每次都不用担心的任何其他方式吗?

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

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

详情请见此处

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

在此输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM