我理解 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
,作为模板代码的一部分。
问题:
如果大多数使用情况需要将
XACT_ABORT
设为ON
,那么是什么导致 SQL Server 将其默认设为OFF
?将XACT_ABORT
默认设为ON
是否会增加 SQL Server 事务处理的开销?SET XACT_ABORT
命令只影响当前会话。我知道可以通过在SSMS > 工具 > 选项 > 查询执行 > SQL Server > 高级
中设置使 SSMS 默认将SET XACT_ABORT ON
,如下图所示:
SET XACT_ABORT ON
。是否有任何方法可以在数据库级别设置XACT_ABORT
为ON
?还有其他全局设置XACT_ABORT
的方法,而不必每次都担心它?