如何正确使用 SET XACT_ABORT ON

Fra*_*ani 9 t-sql sql-server try-catch rollback xact-abort

我们最近被空降到一个新的 ETL 项目,该项目的代码非常糟糕。我手中有一个包含 700 行和各种更新的查询。

我想对其进行调试SET XACT_ABORT ON;,目标是如果只有一个事务失败则回滚所有内容。

但我找到了几种将其存档在 StackOverflow 上的方法,如下所示

BEGIN TRANSACTION;
BEGIN TRY

-- Multiple sql statements goes here

COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
END CATCH
Run Code Online (Sandbox Code Playgroud)

这个

BEGIN TRY
BEGIN TRANSACTION

-- Multiple sql statements goes here

COMMIT TRANSACTION
END TRY
BEGIN CATCH
PRINT(ERROR_MESSAGE())
ROLLBACK TRANSACTION
END CATCH
Run Code Online (Sandbox Code Playgroud)

而这些都没有用途SET XACT_ABORT ON;

我不明白,和SET XACT_ABORT ON使用一样吗BEGIN TRY BEGIN TRANSACTION

我可以只使用:

SET XACT_ABORT ON;

-- Multiple sql statements goes here
Run Code Online (Sandbox Code Playgroud)

并摆脱所有:

BEGIN TRANSACTION;
BEGIN TRY
Run Code Online (Sandbox Code Playgroud)

另外,我应该使用BEGIN TRANSACTIONand thenBEGIN TRY还是反之亦然?

Geo*_*tis 5

这是不一样的。它决定何时抛出错误。

您应该始终使用SET XACT_ABORT ON,因为它更加一致;几乎总是,错误会停止执行并抛出错误。否则,一半的事情会抛出错误,而另一半则继续执行。

Erland Sommarskog 的网站上有一篇关于整个主题的精彩文章,如果您此时访问,您将看到一个描述这种奇怪行为的表格。总之,我推荐错误处理的通用模式,因为它有很好的文档记录,并且为您提供了根据其自己的文档进行调整的机会。