【发布时间】:2019-09-08 04:25:07
【问题描述】:
令人惊讶的是,对于我遇到的这个问题,我找不到任何相关的解释或文档。
在这些 SQL 语句的情况下:
SELECT 1 AS Test INTO #tmpTest
BEGIN TRAN
SELECT 1 AS Test INTO #tmpTest
ROLLBACK TRAN
当一一执行时,第 3 行的 SELECT ... INTO 失败,正如预期的那样,并显示消息 -
数据库中已经有一个名为“#tmpTest”的对象。
但是,在那之后,第 4 行中的 ROLLBACK 语句失败:
ROLLBACK TRANSACTION 请求没有对应的 BEGIN 交易。
即使事务 确实 BEGIN 从第 2 行成功。
我见过SQL Server - transactions roll back on error?,但答案不适用于这里,因为默认的xact_abort 是off。 此外,answer from Quassnoi 与 answer by Raj More 矛盾。
真正的解释是什么?
【问题讨论】:
-
我在 SQL 2017 上尝试过并遇到了同样的情况。很有趣。
-
使用SQL Server 2016,我在第二条
SELECT语句前后添加了SELECT @@TRANCOUNT,然后逐行执行。第一个返回(如预期)1,然后SELECT失败,然后第二个@@TRANCOUNT返回0。 但是,将错误的SELECT包装在try/catch 中,仍然有一个未处理的事务进入CATCH块。令人着迷。 -
我设法收到了这条消息:“消息 3998,级别 16,状态 1,第 1 行在批处理结束时检测到不可提交事务。事务已回滚。”
-
另一个答案比您接受的答案更准确。批量中止是您所看到行为的关键。
-
猜你是对的@MartinSmith。
标签: sql-server tsql sql-server-2008 transactions rdbms