我正在搞乱我的网站开发版的测试数据库。不知何故,我创建了一个阻塞事务,我不知道如何摆脱。
我尝试运行以下查询:
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个用户。)
但是,此查询已成功完成,因此我不知道为什么它仍然可能会挂起事务。我在完成之前取消了此查询的先前版本,是否会产生问题?
导致此阻止事务的原因是什么,以及如何终止它?
答案 0 :(得分:1)
要确定阻止的原因,请查看Understanding and resolving SQL Server blocking problems。
虽然在您的情况下您已经识别出它并且只需要在SSMS窗口中执行COMMIT
足够的时间以使@@TRANCOUNT
为零
WHILE @@TRANCOUNT > 0
COMMIT