sql-server - 如何正确使用 SET XACT_ABORT ON
问题描述
我们最近被跳伞到一个新的 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
或者这个:
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
,因为它更加一致;几乎总是,错误会停止执行并抛出错误。否则,一半的事情会抛出错误,另一半会继续执行。
在Erland Sommarskog 的网站上有一篇关于这整个主题的精彩文章,如果你去到这里,你会看到一个描述这种奇怪行为的表格。总之,我推荐错误处理的通用模式,因为它有很好的文档记录,并为您提供了根据自己的文档调整它的机会。
推荐阅读
- c# - tree data structure with data contained in leaf nodes and all other nodes having just a node name
- linux - Linux 系统日志中看到的“ptymonitor”是什么?
- javascript - 在 While 循环内嵌套 For 循环
- reactjs - 为什么我的 URL 改变了,但我的组件没有改变
- javascript - 升级到 NextJS 9.0 后如何修复 React Hooks?
- django - 如何在 django 的用户模块的个人资料页面中编辑特定用户的详细信息
- javascript - 在嵌套对象函数中键入 this
- excel - Excel Power Query/M - 根据网站上可用的页数动态组合连接数
- salesforce - 模拟 Web 服务调用实现
- html - 带有背景的标题内的中心元素