我们最近被空降到一个新的 ETL 项目,该项目的代码非常糟糕。
我手中有一个包含 700 行和各种更新的查询。
我想用它来调试它SET XACT_ABORT ON;
目标是如果只有一个事务失败则回滚所有事务。
但我找到了几种将其存档在 StackOverflow 上的方法,例如this:
BEGIN TRANSACTION;
BEGIN TRY
-- Multiple sql statements goes here
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
END CATCH
or this:
BEGIN TRY
BEGIN TRANSACTION
-- Multiple sql statements goes here
COMMIT TRANSACTION
END TRY
BEGIN CATCH
PRINT(ERROR_MESSAGE())
ROLLBACK TRANSACTION
END CATCH
这些用途都没有SET XACT_ABORT ON;
.
我不明白,是SET XACT_ABORT ON
与使用相同BEGIN TRY BEGIN TRANSACTION
?
我可以只使用:
SET XACT_ABORT ON;
-- Multiple sql statements goes here
并摆脱所有:
BEGIN TRANSACTION;
BEGIN TRY
?
另外,我应该使用BEGIN TRANSACTION
进而BEGIN TRY
或者相反?
这是不一样的。它决定何时抛出错误。
你应该总是使用SET XACT_ABORT ON
,因为它更加一致;几乎总是,错误会停止执行并抛出错误。否则,一半的事情会抛出错误,而另一半则继续执行。
有一个伟大的article关于整个主题Erland Sommarskog 的网站,如果你去这点您将看到一个描述这种奇怪行为的表格。总之,我推荐错误处理的通用模式,因为它有很好的文档记录,并且为您提供了根据其自己的文档对其进行调整的机会。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)