如果事务被 SET XACT_ABORT ON 终止,则 SET XACT_ABORT OFF

SET XACT_ABORT OFF if transaction terminated by SET XACT_ABORT ON

我读到许多人倾向于 SET XACT_ABORT ON 在程序开始时。

CREATE PROC myProc
AS
Begin
BEGIN TRAN
 SET XACT_ABORT ON
 [..code1 that might throw an error..]
 [..code2..]
 SET XACT_ABORT OFF [?]
COMMIT TRAN
END
SET XACT_ABORT OFF [?]

因为运行-次错误会终止程序,SET XACT_ABORT将保留为ON。我有一些问题:

  1. 你在哪里设置的?在 CREATE PROC 定义之前,在 BEGIN 之后还是在 BEGIN TRAN 之后? SET 处于连接级别,所以我想这三个都不会有什么不同?

  2. 什么时候转OFF如果留ON出现错误?

在 CREATE PROC 定义之前设置 XACT_ABORT 没有多大意义。与 ANSI_NULLS 或 QUOTED_IDENTIFIER 不同,此选项不会存储为存储过程的 属性。我会说您应该在 CREATE PROC myProc AS 之后或在第一个 BEGIN 之后立即设置 XACT_ABORT,您也可以在其中放置 SET NOCOUNT ON。

我不会费心将 XACT_ABORT 设置为关闭。如果任何代码部分需要将其关闭(例如,在忽略某些错误的 TRY-CATCH 块内),则应在该特定 TRY 块内将其关闭,并在 END CATCH 结束时将其重新设置。

有关详细信息,请参阅:http://www.sommarskog.se/error_handling/Part1.html