現象
次のような状況を考えます。
-
Windows、Microsoft SQL Server を Microsoft SQL Server 2012 で SQL Server の 2017 では、Service Broker を使用します。
-
ストアド プロシージャの非同期実行するためには、Service Broker を設定します。
-
Max_Queue_Readersプロパティをストアド プロシージャの同時実行の活性化のインスタンスの数を制限するための Service Broker キューの特定の値に設定します。
このシナリオで発生する複数のタスクがアクティブ化されているMax_Queue_Readersに設定されている値よりも実行しています。
原因
この問題は、次を実行して、マルチ ユーザー モード (MULTI_USER) に、Service Broker データベースがシングル ユーザー モード (RESTRICTED_USER) から切り替えられた場合に発生することができます。
alter database <dbname> set multi_userデータベース上のユーザー モードが変更されると、Service Broker がシャット ダウンと再起動します。この処理中に既存の QueueMonitor オブジェクトを削除すると QueueMonitor オブジェクトの別のインスタンスを作成します。サービス ブローカーのシャット ダウン中に、ライセンス認証プロセスが長時間のオペレーションを実行している場合、QueueMonitor オブジェクトの状態に変更されます破棄されました。
ただし、その参照カウントがゼロに達していないために、既存の QueueMonitor オブジェクトのインスタンスは削除されません。Service Broker の再起動時に、アクティブ化の手順を実行中は、場合、QueueMonitor オブジェクトと QueueMonitor ドロップされたオブジェクトの新しいインスタンスは同じキューに共存します。サービス ブローカーを起動する次に、ドロップされた QueueMonitor オブジェクトのインスタンスが削除されます。
回避策
この問題を回避することを実行することを確認アクティブ化されたプロシージャが実行されていない場合、データベースの [データベース名] の設定の multi_user を変更します。これを行うには、次の方法のいずれかの手順に従います。
-
ユーザー モードを変更する前に、データベース内のすべてのキューを無効にして、すべてのキューを再度有効にします。
-
ユーザー モードを変更する前に、次のコマンドを実行することによって影響を受けるすべてのキューのアクティブ化の手順を無効にして、アクティブ化の手順を再度有効にします。
alter queue <queueName> with activation ( status = off)
詳細
次のように"sys.dm_broker_activated_tasks"に対してクエリを実行して、特定のキューを実行しているアクティブ化の手順の数を確認できます。
select * from sys.dm_broker_activated_tasks where queue_id = <queue number>キュー モニターの状態を照会するには、次のクエリを実行します。
Select * from sys.dm_broker_queue_monitors where queue_id = <queue number>データベース ・ ユーザー ・ モードが変更された場合は「削除」とは、キュー モニターの状態が表示されます。