问题标签 [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 投票
1 回答
2020 浏览

sql-server - XACT_ABORT 的范围是什么

SQL Server 2005 中的 SET XACT_ABORT 语句的范围是什么?即:开始-结束块、过程或触发器、连接、数据库、服务器?

0 投票
1 回答
646 浏览

sql-server - 这些代码片段是否等效('set xact_abort on' vs 'try catch rollback')?

我曾经在 SQL Server 的存储过程中使用此代码片段:

但是今天我知道了'set xact_abort on'声明。下面的代码是否等同于前面的代码?它们之间有什么区别吗?

0 投票
2 回答
589 浏览

sql-server - SET XACT_ABORT ON 被忽略,事务继续(SQL Server 2008 R2)

也许我遗漏了一些东西,但即使RAISERROR下面的 s 的严重性为 16(根据文档),事务仍然被提交,好像XACT_ABORT ON没有任何效果。

打电话

生产

Msg 50000,Level 16,State 2,Procedure RemoveMember,Line 20
指定的用户不是该组的管理员
Msg 50000,Level 16,State 3,Procedure RemoveMember,Line 24
你不能删除自己

我认为XACT_ABORT如果设置为应该回滚整个事务ON

0 投票
1 回答
889 浏览

sql - SQL Server 2005:混淆使用 XACT_ABORT=ON 和 TRY...CATCH

当 TRY 块中出现错误时,我对使用 XACT_ABORT ON 和 TRY...CATCH 构造来尝试回滚 CATCH 块中的事务感到有些困惑。

我有一个像这样结构化的存储过程(当然在这里简化了):

所以 SP 的目的是这样工作:如果事务在任何时候失败,它应该回滚。所以当插入位失败时,删除位应该回滚,即表应该和之前一样的状态。

现在,假设在运行时 dbo.fn_DoSomething() 函数不可用(它已被 DBA 错误地删除)。上面写的 SP 按预期工作,即事务回滚,表保持不变,SSMS 中显示的错误消息如下所示:

消息 208,级别 16,状态 1,过程 usp_clean_and_re_Insert,第 15 行无效对象名称 'dbo.fn_DoSOmething'。

但是由于某种原因,来自 CATCH 块的 PRINT 语句似乎没有执行,即我在 SSMS 中看不到它们?关于 TRY...CATCH 的 Microsoft 文档说,如果在 TRY 块中执行期间发生错误,则执行将传递给 CATCH 块(https://msdn.microsoft.com/en-us/library/ms175976(v=sql .90).aspx )。

但是,如果我删除 XACT_ABORT ON,事情会变得更加奇怪:

  1. PRINT 语句仍然没有出现在 SSMS 中

  2. 与上面相同的错误正确显示,即

消息 208,级别 16,状态 1,过程 usp_clean_and_re_Insert,第 15 行无效对象名称 'dbo.fn_DoSOmething'。

  1. 有一个最后的错误说:

“消息 266,级别 16,状态 2,过程 usp_clean_and_re_Insert,第 52 行 EXECUTE 后的事务计数表明缺少 COMMIT 或 ROLLBACK TRANSACTION 语句。先前计数 = 0,当前计数 = 1。”

这导致表被锁定,直到我断开 SSMS(SP 运行的查询窗口),之后表再次可用,所有结果都完好无损(因此数据库引擎必须隐式回滚不可提交的事务)。

阅读有关此错误消息的其他帖子(例如这个:EXECUTE 后的事务计数表示 BEGIN 和 COMMIT 语句的数量不匹配。以前的计数 = 1,当前计数 = 0),我知道我需要检查 CATCH 块中的 XACT_STATE并回滚不可提交的事务(这与来自:https ://msdn.microsoft.com/en-us/library/ms189797.aspx 的建议相同),但这正是我在上述 SP 中所做的,但事务在我断开 SSMS 之前不会回滚(没有 XACT_ABORT ON)?

我很困惑!总之:

  1. 为什么我在 SSMS 中看不到 PRINT 语句?

  2. 为什么从存储过程中删除 XACT_ABORT ON 时,CATCH 块中的 ROLLBACK TRANSACTION 不执行?

  3. 如果 XACT_ABORT ON 似乎可以自己完成这项工作,为什么还要使用 TRY...CACTH?即,如果我删除 Try..catch 并保留 XACT_ABORT ,它会回滚事务,那么为什么我需要在 catch 块中使用隐式 ROLLBACK TRANSACTION 的 TRY CATCH 呢?

0 投票
3 回答
663 浏览

sql-server - 带排除的 SQL Server XACT_ABORT

我有一个更大的存储过程,它利用几个 TRY/CATCH 块来捕获和记录单个错误。我还围绕程序的全部内容包装了一个事务,以便能够在沿途某处出现错误的情况下回滚整个事情(以防止大量混乱的清理);XACT_ABORT 已启用,否则它不会回滚整个事务。

关键组件:
我的数据库中有一个表,每次运行此过程时都会插入一条记录,其中包含操作结果和问题的详细信息。

有趣的事情正在发生 - 实际上,当我终于弄清楚出了什么问题时,这很明显......我的日志表中的插入语句也正在回滚,因此,如果我没有在 SSMS 中运行它,我什至看不到这是否已运行,因为回滚会删除所有活动的恍惚状态。

问题:
除了这个单一的插入语句之外,是否有可能让整个事务回滚?我仍然想保留在存储过程运行期间编译的错误消息。

非常感谢!

~以利

更新 6/28
这是我正在查看的代码示例。这与@Alex 和@gameiswar 提出的样本之间的主要区别在于,在我的例子中,try/catch 块都嵌套在单个事务中。这样做的目的是有多个捕获(对于多个表),尽管即使最后一次更新失败,我们也会回滚整个混乱。

0 投票
2 回答
4742 浏览

sql-server - 使用 SP_ExecuteSQL 时事务中断

我正在使用 SQLServer 2014,我有一个简单的数据库,其中一个表有一个 ID 和一个名为 data 的 varchar 列。当我运行以下语句时,有一些奇怪的行为:

SSMS 显示出现错误,因为我试图在sp_executesql调用中运行不正确的查询。但是,它也显示1 row(s) affected. 如果我在 testTable 上运行选择查询,我可以看到值“b”被插入。

如果我将语句包装在一个TRY/CATCH块中,一切都会按预期工作,并且整个事务操作都会回滚:

如果出现SET XACT_ABORT ON问题,不应该确保整个事务回滚吗?有没有我错过的设置?

谢谢

0 投票
1 回答
6728 浏览

sql-server - 为什么 SQL Server 默认 XACT_ABORT 为 OFF?可以全局设置为ON吗?

我了解SET XACT_ABORT命令的目的:

当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句引发运行时错误,则整个事务将终止并回滚。

当 SET XACT_ABORT 为 OFF 时,在某些情况下,只有引发错误的 Transact-SQL 语句被回滚并且事务继续处理。根据错误的严重程度,即使 SET XACT_ABORT 为 OFF,也可能回滚整个事务。关闭是默认设置。

一般来说,如果出现错误则希望继续处理事务的场景将超过出现错误时希望回滚整个事务的场景,因为我经常听到 DBA 和博客建议保持SET XACT_ABORT ON避免遇到不一致的事务结果。我已经看到我们所有的存储过程也有SET XACT_ABORT ON,作为模板代码的一部分。

问题:

  1. 如果大多数用例都需要XACT_ABORTON那么会导致 SQL Server 将其默认OFF为什么?是否会默认XACT_ABORTONSQL Server 事务处理增加任何开销?

  2. SET XACT_ABORT命令仅影响当前会话。我知道我可以将 SSMS 默认设置为SET XACT_ABORT ONfrom SSMS > Tools > Options > Query Execution > SQL Server > Advanced,如下图所示: 在此处输入图像描述 但这仅限于通过 SSMS 运行的 SQL 语句,并且对通过应用程序代码/SSIS 包调用的存储过程没有帮助。对于这些程序,我仍然必须SET XACT_ABORT ON在每个程序中重复。有什么办法XACT_ABORT可以ON在数据库级别设置?还有其他方法可以设置XACT_ABORT全局并且不必每次都担心吗?

0 投票
2 回答
159 浏览

sql-server - XACT_ABORT 关闭时事务默认回滚

我有以下交易

由于第二UPDATE条语句(AccountID是一int列)失败,并且整个语句被包裹在一个TRAN块中,因此第一条语句中的更改回滚并且不会扣除 AccountID 1 的余额。

由于上面的代码中没有ROLLBACK语句,似乎 SQL 服务器会自动回滚,而不需要显式ROLLBACK语句

当我查看它时,似乎自动回滚行为是由一个名为xact_abort.

我在网上找到了以下脚本,它打印出打开的设置

但是,在我的服务器上运行时,XACT_ABORT不会出现在打印列表中,因此没有打开。

ROLLBACK我的问题是:当 SQL Server 似乎在自动回滚时,需要什么语句?

0 投票
1 回答
330 浏览

sql-server - 为什么 SQL Server 存储过程将加密数据选择到变量中失败

从加密列(始终加密)中选择数据到变量中的存储过程失败并出现错误

无法继续执行,因为会话处于 kill 状态

如果XACT_ABORT设置为开。

删除行使SET XACT_ABORT ON;存储过程完美地工作,但不清楚它是如何相关的。

完全删除变量也可以修复错误。

环境:

  • Microsoft SQL Server 2016 Enterprise (64-bit) Service Pack 2 with CU2 (13.0.5153.0):目前最新版本。
  • 微软视窗 NT 6.3 (15063)

存储过程:

表声明:

样本数据:

调用存储过程:

错误:

Msg 596, Level 21, State 1, Line 29
无法继续执行,因为会话处于终止状态。

消息 0,级别 20,状态 0,第 29 行
当前命令发生严重错误。结果,如果有的话,应该丢弃。

我没有找到关于 XACT_ABORT 和 Always Encrypted 如何相关的参考资料。

我还检查了 SQL Server 日志,但没有发现有关该问题的其他信息。

更新

链接到已注册的 SQL Server 错误

0 投票
1 回答
352 浏览

sql-server - EF Core 为所有数据库连接设置 XACT_ABORT

我正在使用 EF Core 3.1 连接到 SQL Server。我想SET XACT_ABORT ON为我在我的应用程序中建立的所有连接启用 SQL Server。

启动或上下文创建是否有我可以运行的挂钩?因为我正在使用 AWS RDS,所以我无法在服务器范围内打开它。

任何帮助,将不胜感激。