当前位置: 首页 > 知识库问答 >
问题:

SQL Server:BEGIN TRAN...COMMIT with ROLLBACK不会根据错误进行回滚

狄兴邦
2023-03-14
CREATE TABLE [Test]
(
    [BookID] [int] NOT NULL,
    [Name] [varchar](512) NOT NULL,

    CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED ([BookID] ASC)
) ON [PRIMARY]
BEGIN TRAN;

INSERT INTO Test (BookID, Name) Values (1,'one');
INSERT INTO Test (BookID, Name) Values (2,'Two');
INSERT INTO Test (BookID, Name) Values (1,'Three');
INSERT INTO Test (BookID, Name) Values (4,'Four');

COMMIT TRAN;

但实际上表中包含bookId=1,2,4的行。

如果我上设置XACT_ABORT,那么我将得到预期的行为。

然后,对于另一段代码,当错误类似于

为了确保得到回滚,我应该在TRY...COMMIT CATCH rollback语句中包含该语句。

但是我仍然想知道为什么没有回滚的BEGIN TRAN不能一直工作。真的像我猜测的那样取决于错误的类型吗?

共有1个答案

诸葛嘉熙
2023-03-14

但是我仍然想知道为什么没有回滚的BEGIN TRAN不能一直工作。真的像我猜测的那样取决于错误的类型吗?

您是对的,这取决于错误的类型。以下Erland的语句帮助我更多地了解了SQL Server中错误处理的不同变体。

SQL Server中的错误处理是一个非常混乱的故事。我问的问题与您在1993年左右在comp.databases.sybase中问的问题相同。我不记得具体得到了什么答案,但我认为答案不是很好。

为微软辩护的是,许多这些糟糕的决定都是在加利福尼亚做出的,当时产品还是Sybase。另一方面,微软非常努力地解决这一问题,而恰恰相反。

不同场景见下图截图

这个链接有关于每种行为的极好的信息

可能有很多原因。其中包括

  1. 您有一个正在显示日志空间重用的活动事务
  2. 繁重的事务,可能需要大量的日志空间,您的磁盘可能已满

附加参考:

 类似资料:
  • 当对进行stubbing时,我会得到以下关于用返回值对void方法进行stubbing的错误消息,尽管不是void。该错误似乎与有关,尽管我正在插入。 我的测试: 为什么会发生这种情况,我如何修复它?

  • 我们为JPA配置了Spring数据。服务事务方法不会因错误而回滚(例如,DB ConstraintViolationException)。 我能找到的最接近的是这个(事务不回滚)Spring-data、JTA、JPA、Wildfly10但是我们没有任何XML配置,我们所有的配置都是基于Java的。 本质上,服务方法如下所示:不捕获错误,抛出所有内容。

  • 问题内容: 尝试使用默认的仅当前行错误消息来调试PHP是可怕的。产生错误时,如何使PHP产生回溯(堆栈跟踪)? 问题答案: Xdebug会在错误时显示回溯表,您无需编写任何PHP代码即可实现。 缺点是您必须将其安装为PHP扩展。

  • 我现在正在学习不透明类型,仍然有点混乱。我尝试了以下方法: 在的返回行中,我得到以下错误 “?:”中的结果值表达式具有不匹配的类型“Cat”和“Dog” 因此,据我所知,就像泛型一样,编译器需要能够在编译时决定函数的具体返回类型。 我说得对吗?如果我是,这条消息是不是让人困惑,因为两个结构都实现了?如果我错了,这个错误消息是什么意思? 谢谢 编辑:我试图理解,而不是让它工作:)

  • 我是JS的学生。我有一段代码返回了一个错误。 这是返回的语法错误。你们能解释一下我做错了什么吗?

  • 问题内容: 这是我的数据: SQL字段: http **://sqlfiddle.com/#!2/dfe09/1** 对于每个组,我想将返回的item_ID的数量限制为最多2个。我不在乎返回哪个2个。如果该组少于2行,则仅返回1行。 我无法为每个组写一个select top * 2并合并选择,因为我有几百个组。 我不确定从哪里开始,非常感谢您的帮助。 使用MS SQL 2005 (表布局与示例中的