问题标签 [xact-abort]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
116 浏览

sql-server - SQL Server - Try-Catch / xact_abort off 和 xact_state

我们有一个数据导入系统,我们正在处理 CSV 文件,每个文件都包含一组必须单独验证和处理的记录。如果它们由于某种原因失败,它们会被标记为错误,然后我们继续下一条记录。它们可能因逻辑错误或数据库错误(例如重复键或外键错误)而失败。

处理数据的存储过程要么从客户端应用程序调用,要么从代理作业调用。不同之处在于应用程序将创建事务,而作业在调用 proc 之前不会。


到目前为止相当简单,但是查看大量文档,它说您应该在 catch 块中检查 xact_state 是否为 -1,但我不希望此时事务失败。我只想继续导入的下一行。因此,如果 xact_abort 关闭,我们会在 catch 块中获得 -1 的 xact_state 吗?

我知道 catch 实际上并没有捕获所有错误,但是我发现如果您使用 try catch 块创建父 proc,那么它将捕获比实际 proc 中的块更多的错误。所以我会将循环逻辑移动到父进程,然后在当前进程中进行处理。

我还应该做些什么来减轻可能发生的任何错误?

希望这不会太混乱。干杯阿德里安

0 投票
3 回答
184 浏览

sql-server - 如何正确使用 SET XACT_ABORT ON

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

我想调试它,SET XACT_ABORT ON;目标是在只有一个事务失败时回滚所有内容。

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

或者这个

并且没有这些用途SET XACT_ABORT ON;

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

我可以使用:

并摆脱所有:

?

而且,我应该使用BEGIN TRANSACTION然后BEGIN TRY还是相反?