【发布时间】: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,作为模板代码的一部分。
问题:
如果大多数用例都要求
XACT_ABORT为ON,那么 SQL Server 将其默认为OFF的原因是什么?将XACT_ABORT默认为ON是否会增加 SQL Server 事务处理的开销?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并且不必每次都担心吗?
【问题讨论】:
-
您可以随时通过活动连接发出 SET XXX ON/OFF,该选项将应用于整个会话
标签: sql-server tsql transactions xact-abort