问题标签 [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.
sql-server - 这里会发生什么?SQL Server - XACT_ABORT ON + @@ERROR 检查。.
这种情况会发生什么?
我的猜测是因为永远XACT_ABORT
不会发生(因为整个事情被回滚并终止),最后一条语句也没有(检查然后调用)。ON
COMMIT TRANSACTION
@@error
raiseerror
sql-server-2008 - 处理不可提交事务 SQL SERVER
我有一个程序如下
事务 B 正在引发错误,因此该进程将进入不可提交状态并引发以下错误。我检查了 XACT_STATE() 值为 -1
消息 3930,级别 16,状态 1,过程 xxxxxxxx,第 70 行当前事务无法提交,并且无法支持写入日志文件的操作。回滚事务。
有没有其他方法可以通过跳过事务 B 并执行事务 C 来解决这个问题
sql - SET XACT_ABORT ON 在创建过程中不起作用
我使用 SQL Server 2008 SP3 (10.0.5500) 并且我在回滚事务方面遇到了一些问题,首先我需要知道一些事情。这是我的创建过程脚本:
运行此脚本后,我检查程序来自:MyDB ->Programmability->StoredProcedures
然后单击修改[Members].[MyProc]
然后这是显示的脚本:
那么在哪里SET XACT_ABORT ON
?为什么这里没有显示?由于存储过程中的回滚事务存在一些问题,我认为SET XACT_ABORT ON
从未保存过。我对吗?如果是,解决方案是什么?我不能SET XACT_ABORT ON
在存储过程中使用?或者我的错在哪里?
sql-server - 如何使 SET XACT_ABORT ON 回滚事务?
根据Books Online 的文档SET XACT_ABORT ON
,我得到的印象是,如果 T-SQL 语句引发运行时错误,则整个事务将终止并回滚:
评论
当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句引发运行时错误,则整个事务将终止并回滚。
在 SQL Server 2008 R2 中对此进行测试:
给出输出:
SET XACT_ABORT ON
如果出现错误,我也认为终止批处理:
SET XACT_ABORT ON 指示 SQL Server 回滚整个事务并在发生运行时错误时中止批处理。
听起来很方便。我怎样才能让它也这样做?
tsql - 分别在父/子存储过程中打开/关闭 XACT_ABORT 有什么影响?
我正在尝试改进当前系统的错误处理以产生更有意义的错误消息。我有一个“根”存储过程,可以多次调用其他嵌套存储过程。
在根 sp 中,XACT_ABORT
设置为 ,ON
但在嵌套过程中,XACT_ABORT
设置为OFF
。我想从较低级别的程序中捕获特定错误,而不是获取根程序的错误。
我经常看到错误,uncommittable transaction is detected at the end of the batch, the transaction is being rolled back.
将这些“混合”环境与XACT_ABORTs
?
此外,如果您对高级错误处理有任何建议,我们将不胜感激。我想我想使用sp_executesql
这样我就可以传递参数来获取错误输出,而无需修改所有存储过程并使用它RAISERROR
来调用父过程的CATCH
块。
sql-server-2008 - 分布式交易失败时如何检索错误代码和消息?(MS 故障诊断码)
我们有一个存储过程,它通过具有不同 MS SQL 2008 数据库的链接服务器启动分布式事务。
我们用
并且
围绕事务捕获任何错误并将错误代码和消息返回给调用客户端。
但是,当分布式事务中的命令失败时,似乎 MS DTC 正在接管控制,而我们的 catch 块不能“优雅地”回滚并返回错误消息等。相反,会引发错误:Microsoft Distributed Transaction Coordinator (MS DTC) 已取消分布式事务。(错误 1206)。
有什么方法可以让 catch 块捕获这样的分布式 tx 错误?
tsql - 在 SQL Server 2000 中第一次插入失败时触发器退出并且无法将 xact_abort 设置为 OFF
我已经构建了一个简单的数据库,可以在 SQL Server 2005 上运行,现在需要让它在 SQL Server 2000 上运行。目标如下:
- 我收到一个包含约 5k 条记录的每日数据馈送到一个暂存表中。
- 当这个插入完成时,一条记录会被添加到一个名为 TRIGGER_DATA 的表中。
- 我在该表上创建了一个“插入时”触发器,然后尝试将其中的数据一次插入 FACT_data 表中的一条记录。
- FACT_data 表是许多 DIM 表的外键,这些表定义了字段可以接受的输入。
- 如果任何记录违反外键约束,则插入应该失败,并且应该将记录插入到 Load_error 表中(该表没有外键并且所有字段都可以为空)。
触发器有一个主要的 try-catch,然后我在 EXEC 语句上使用第二个 try-catch 来插入 FACT_data 表,以将失败的记录引导到 Load_error 表中。
在兼容级别 90(即 SQL Server 2005)下,我可以在触发器中将 XACT_ABORT 设置为 OFF,并且一切似乎都工作正常 - 下面的代码可以工作。但是,在兼容级别 80 或更低的情况下,您无法从触发器中设置此参数,并且我的代码在第一次遇到插入错误时会失败。
目前我唯一想到的解决方法是在 Stage_data 表上创建一个 on insert 触发器,然后每个触发器处理一行数据。但是我不喜欢这种解决方案,因为数据量很大并且可能会增加,而且一次触发 5000 个触发器似乎不是一个好主意。
任何人都可以提供或指出解决方案的方向吗?
--------- SQL SERVER 2005 代码提取:
ON TRIGGER_DATA FOR INSERT AS BEGIN SET NOCOUNT ON;
声明@strfields varchar(4000) 声明@sql1 VARCHAR(8000); 声明@sql2 VARCHAR(8000); 声明@row_ID varchar(10)
结尾
非常感谢
- - - - - - - 编辑: - - - - - - - - - - - - - - - - - - ------
我试图修改我的代码以在 sql server 2000 下工作(即用@@error 检查替换 try-catch)。但是,每次发生 FK 违规时,它都会中止失败。谁能告诉我我做错了什么?
ON TRIGGER FOR INSERT AS BEGIN SET NOCOUNT ON;
声明 @row_ID INT
结尾
sql-server - 设置 xact_abort 并尝试一起捕捉
我的 sp 中有一个 try catch 块,在 try 中只有一个 insert 语句。如果是 pk 违规,则 catch 检查错误代码,如果是则进行更新。但有时我得到“当前事务无法提交,并且无法支持写入日志文件的操作。回滚事务。
在批处理结束时检测到不可提交的事务。事务已回滚。”所以我添加了 xact_abort,但随后我不断收到“EXECUTE 后的事务计数表明 BEGIN 和 COMMIT 语句的数量不匹配。”我找到了这个 。http://www.ashishsheth.com/post /2009/08/14/Set-XACT_ABORT-ON-and-TryCatch-block-in-Sql-Server-2005.aspx
如果这是真的。如果打开 xact_abort 的 try 块中出现错误,我的 catch 代码会不会运行?
sql - 触发器中的事务处理(TRY/CATCH....XACT_ABORT ON)
我在 SQL Server 2008R2 上有流程场景:
• 一个usp 收集数据,然后在两个SQL Server 之间传输数据
此过程将在流程的所有级别(usp、SSIS 和触发器)的事务中完成
在将数据传输到 DB7.dbo.Dest 的数据流中,该表有一个 AFTER INSERT 触发器,它将刚刚通过的数据插入到最终表 DB7.dbo.FinalDestination 中:
在每个级别,由于数据的敏感性正确并完全进入决赛桌,我都试图对数据进行防御。
关于 SSIS,从我阅读和测试的内容来看,它似乎工作正常。
我最担心的是我在上面编写的触发器。根据我的阅读和理解,设置 XACT_ABORT ON 将在出现任何错误时回滚 TRY 块内的事务(换句话说,存在不可提交的事务)。在这种情况下,我继续在 CATCH 块中添加回滚事务部分作为一个想法,因为它永远不会到达(根据我的理解)。同时,我添加了 WITH (TABLOCK) 选项,以便在执行 INSERT 时锁定表。
在触发器的情况下,在 XACT_ABORT 为 ON 的情况下,TRY...CATCH 是否必要?TRY 块内是否需要 COMMIT TRANSACTION?正如我也看到它在基于 @@TRANCOUNT 的 CATCH 块之后提交
欢迎回答和批评,并在此先感谢您。当我试图概括名称时,请原谅任何错别字......
transactions - SET_XACT_ABORT ON 在一个事务中,在 catch 块中存在回滚
目前只是通过一些教程,我在存储过程中看到了很多代码,如下所示。
SET_XACT_ABORT ON BEGIN TRY .... 提交事务
结束尝试开始捕获回滚事务结束捕获
只是想知道为什么这里的 SET_XACT_ABORT ON 是必要的,因为无论如何都不会在 Catch 块中捕获任何抛出或引发错误并且事务将回滚?
谢谢