意外的,长时间运行的阻塞事务

时间:2011-09-13 11:50:28

标签: sql-server-2008

我正在搞乱我的网站开发版的测试数据库。不知何故,我创建了一个阻塞事务,我不知道如何摆脱。

我尝试运行以下查询:

SELECT COUNT(*) FROM Users

但查询不会去任何地方。我发现以下事务阻止了它:

TransactionID: 19593
Transaction name: user_transaction
Total Locks: 158,936
Transaction Type: Full Transaction
Isolation Level: Unknown

此交易已运行90分钟。

我相信它与我运行的这个查询有关:

DECLARE @cursor CURSOR
DECLARE @userid uniqueidentifier

SET @cursor = CURSOR
FOR
SELECT TOP(1000) userid FROM Users

OPEN @cursor

FETCH NEXT FROM @cursor INTO @userid

DECLARE @counter int = 0
WHILE @@FETCH_STATUS = 0
BEGIN

    SET @counter = @counter + 1
    PRINT @Counter
    EXEC sp_removeUser @userid, 0

    FETCH NEXT FROM @cursor INTO @userid
END

(我知道游标很糟糕,但通常不需要一次删除5000个用户。)

但是,此查询已成功完成,因此我不知道为什么它仍然可能会挂起事务。我在完成之前取消了此查询的先前版本,是否会产生问题?

导致此阻止事务的原因是什么,以及如何终止它?

1 个答案:

答案 0 :(得分:1)

要确定阻止的原因,请查看Understanding and resolving SQL Server blocking problems

虽然在您的情况下您已经识别出它并且只需要在SSMS窗口中执行COMMIT足够的时间以使@@TRANCOUNT为零

WHILE @@TRANCOUNT > 0
  COMMIT