在MngStd中取消的tran仍然存在

时间:2017-07-13 12:07:19

标签: sql-server sql-server-2008 transactions ssms

我正在尝试使用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

1 个答案:

答案 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;