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

Hap*_*own 6 t-sql sql-server transactions xact-abort

我理解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默认为SET XACT_ABORT ONSSMS > Tools > Options > Query Execution > SQL Server > Advanced如图所示在此图像中: 在此输入图像描述 但这仅限于通过SSMS运行的SQL语句,并且对通过应用程序代码/ SSIS包调用的存储过程没有帮助.对于那些程序,我仍然需要SET XACT_ABORT ON在每个程序中重复.有没有办法在数据库级别XACT_ABORT设置ON?我可以设置XACT_ABORT全局的其他任何方式,而不必每次都担心吗?

Ed *_*per 5

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

EXEC sys.sp_configure N'user options', N'16384'
GO
RECONFIGURE WITH OVERRIDE
GO
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参见此处

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

在此处输入图片说明