我正在尝试使用ManagentStudio执行下一个查询(见下文)。查询执行时间开始花费很长时间,我点击ManStd窗口顶部的红色方形StopExecution按钮,查询停止处理并且其结果被取消。然后我发出'select @@ trancount'语句,它显示有一个打开的事务。自从我点击StopExecution以来,该交易已被回滚,对吧?为什么我收到消息说有一个打开的事务,为什么sp_lock告诉我在X锁定下有一堆MyTable的RID?所有操作都在SQL Server 2008(RTM)上执行
Declare @i Integer = 1;
Begin transaction
While @i <= 100000
Begin
Insert into MyTable
Values(default);
Set i+=1;
End
Commit transaction
答案 0 :(得分:2)
默认情况下,取消查询不会回滚事务。当您在SSMS中按取消按钮或执行期间发生超时时,应用程序或客户端API只会发送注意请求以指示SQL Server停止执行当前批处理。默认情况下,交易将保持有效。
您可以指定SET XACT_ABORT ON
,以便关注事件也会回滚事务。这可以在SSMS中配置(查询 - >查询选项 - 高级)。显式SET XACT_ABORT ON
并且应该包含在BEGIN TRAN
的所有存储过程中,以避免在查询超时后出现问题。
SET XACT_ABORT ON;
DECLARE @i Integer = 1;
BEGIN TRANSACTION;
WHILE @i <= 100000
BEGIN
INSERT INTO dbo.MyTable
VALUES(default);
SET i+=1;
END
COMMIT;