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

尝试中的SQL事务...catch不会回滚

戎元忠
2023-03-14

我正在学习在SQL中使用Try…Catch和Transactions,我试图在我拥有的一些数据上测试这一点。据我所知,如果一次执行失败,那么catch将回滚整个批处理,因此TRY部分中的任何表都不应该被更新。然而,当我运行此操作时,它将在catch块中抛出@b表的错误,但它仍然会插入@a表的值

SET XACT_ABORT ON;

Begin Try
  Begin Transaction s1
    Insert Into @a
      Values(@CountryId,@Country,@CountryCode,@DisplayImage,0,@ContinentCode,40)
    Insert Into @b
      Values('xxxxx',@ContinentCode,@Continent,0) --ERROR   
  Commit Transaction
End Try
Begin Catch
  Select ERROR_NUMBER(),ERROR_MESSAGE()
  Rollback Transaction s1
End Catch

select * from @a
select * from @b

CATCH BLOCK运行,我看到error_number和error_message,但是第一个插入不应该回滚吗?

共有1个答案

徐安康
2023-03-14

变量和表变量不是数据修改的一部分,所以它们不是回滚。回滚或保存在事务中是为数据修改工作的。在您的代码中使用临时表而不是表变量。它会起作用的。

 类似资料:
  • 我们有一个Spring事务回滚问题,其中回滚似乎不起作用 在用注释的服务层方法中,我调用三个不同的类来插入3条记录 中间插入从第四个表执行get以填充描述字段,但此get失败。我希望第一次插入会回滚,但它似乎没有发生 几点: 获取方法抛出运行时异常 我们使用和中定义的。Bean是在中创建的,它被导入到 在层 中没有 注释 我们已经使用了

  • 迁移工作得很好,但事务根本不起作用。 我尝试公开我的设置: 运行在docker容器中的MariaDB 10.1(我已经证明了测试中使用的所有表都在InnoDB中,因此支持事务处理) 基测试类正在使用 我尝试了一个单独的连接与一起进行测试,并使用默认连接进行测试。事务也不起作用

  • 问题内容: 我创建了一个存储过程,该过程运行许多命令来修改数据。如果一切成功,我只想提交事务。我通过以下方式使用try- catch块来实现此目的(其中,真实的CATCH块使用RAISERROR返回错误消息): 这就是我想要的方式。例如,如果我将MyBitColumn设置为’b’而不是1,则捕获了错误,控制权流到了CATCH,并且未提交事务。 我注意到的一个问题是,如果说数据库中不存在Table3

  • 这是我编写的一个简单测试。 我的理解是,由于我在上设置了XACT_ABORT,当第二个创建过程失败时,整个事务将回滚。相反,只有发生错误的事情(第一个创建过程)才会回滚,最后一个创建过程执行得很好。然后,我得到一条消息,说提交事务请求没有相应的开始事务。 我见过有人对RAISEERROR有问题,但XACT_ABORT的文档表明,RAISEERROR不honnor XACT_ ABORT。但这并没有

  • 问题内容: 有没有一种方法可以不使用ROLLBACK来回滚到事务的先前状态? 信息: ROLLBACK TRANSACTION请求没有相应的BEGIN TRANSACTION。 任何输入都会有很大的帮助。 谢谢 !!! 问题答案: 要在明确将IMPLICIT_TRANSACTIONS设置为ON时扩展gerrytans答案,可以使用ROLLBACK。请参阅与此相关的MSDN doco 。请注意,这不

  • 我有一个记录表Table1 这里,我想将F1 Varchar的数据类型更改为Decimal(3,0);然后,我创建一个具有新结构的新表。 我想通过显式地将varchar转换为decimal,将旧表的每个recod插入到new中。所以我在try catch块中写了这个命令。如果产生了错误,那么在catch块中我可以用它的默认值填充它。但是整个工作是在begin transaction和commit