9

我了解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_ABORTONSQL Server 事务处理增加任何开销?

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

4

1 回答 1

7

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

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

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

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

在此处输入图像描述

于 2017-04-04T07:24:36.427 回答