2011-09-13 5 views
0

私のウェブサイトの開発版のテストデータベースを使いこなしています。どういうわけか、私は取り除く方法を知らないブロッキング取引を作成しました。予期しない、長時間実行中のブロッキングトランザクション

私は次のクエリを実行しようとした:

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

@@TRANCOUNTをもたらすためにSSMSのウィンドウに十分な時間をCOMMITを実行する必要がありますか?あなたはカーソルが非難するという結論にどのように来たのですか?あなたはそれをどこで実行していましたか? SSMSで?もしそうなら、ウィンドウはまだ開いていますか?もしそうなら 'SELECT @@ TRANCOUNT'はあなたに何を伝えますか? –

+0

私はブロックしている可能性のある他のクエリを実行していないので、カーソルになっているに違いないと思います。そしてはい、それはSSMSです。 ...ウィンドウを閉じようとすると、コミットされていないトランザクションについて何か言います。うわー。正しい構文は何ですか? – Oliver

+0

'@@ TRANCOUNT'をゼロにするには' COMMIT'を十分な時間実行する必要があります。 –

答えて

1

ブロックの原因を特定するには、Understanding and resolving SQL Server blocking problemsを参照してください。

けれども、あなたの場合には、あなたはすでにそれを特定し、明示的なトランザクションでそのカーソルを実行していただけで、ゼロ

WHILE @@TRANCOUNT > 0 
    COMMIT 
関連する問題