私のウェブサイトの開発版のテストデータベースを使いこなしています。どういうわけか、私は取り除く方法を知らないブロッキング取引を作成しました。予期しない、長時間実行中のブロッキングトランザクション
私は次のクエリを実行しようとした:
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人のユーザーを削除する必要はない。)
しかし、このクエリは正常に完了したので、なぜトランザクションがまだ掛かっているのか分かりません。私は完了する前に、このクエリの以前のバージョンをキャンセルしました、それは問題を作成しましたか?
このブロック取引を引き起こした原因は何ですか?また、どのように終了することができますか?
に
@@TRANCOUNT
をもたらすためにSSMSのウィンドウに十分な時間をCOMMIT
を実行する必要がありますか?あなたはカーソルが非難するという結論にどのように来たのですか?あなたはそれをどこで実行していましたか? SSMSで?もしそうなら、ウィンドウはまだ開いていますか?もしそうなら 'SELECT @@ TRANCOUNT'はあなたに何を伝えますか? –私はブロックしている可能性のある他のクエリを実行していないので、カーソルになっているに違いないと思います。そしてはい、それはSSMSです。 ...ウィンドウを閉じようとすると、コミットされていないトランザクションについて何か言います。うわー。正しい構文は何ですか? – Oliver
'@@ TRANCOUNT'をゼロにするには' COMMIT'を十分な時間実行する必要があります。 –