Share via


メッセージの保有

キューでメッセージの保有が指定されていると、Service Broker はメッセージ交換が終了するまで、キューからメッセージを削除しません。さらに、送信メッセージもキューにコピーします。これにより、サービスは受信メッセージと送信メッセージの正確な記録を保持できます。

メッセージの保有により、メッセージ交換がアクティブな間、キューのメッセージ交換の正確な記録を保持できます。詳細な監査が必要なアプリケーションや、メッセージ交換が失敗したときに補正トランザクションを実行する必要のあるアプリケーションでは、メッセージ交換中に各メッセージを状態テーブルにコピーするよりも有効です。

メッセージの保有により、アクティブなメッセージ交換のキューのメッセージ数が増加し、メッセージの送信時に SQL Server が実行する作業量も増加します。そのため、パフォーマンスが低下します。パフォーマンスへの正確な影響度合いは、キューを使用するサービスの通信パターンによって異なります。一般に、アプリケーションを正しく動作させるのにメッセージの保有が必要な場合は、必ずメッセージの保有を使用する必要があります。メッセージ交換がアクティブな間に送受信されたすべてのメッセージの正確な記録が不要な場合は、状態テーブルに状態を保持することでパフォーマンスを向上できます。また、メッセージ交換が終了すると、保有されていたメッセージがキューから削除されるので、監査目的で保有を使用する場合は、メッセージ交換を終了する前に、永続的なストレージにメッセージをコピーする必要があることにも注意してください。

注意

メッセージの保有を使用すると、パフォーマンスが低下することがあります。この設定は、アプリケーションのサービス レベル契約で、送受信される正確なメッセージを保持する必要がある場合のみ使用してください。

キュー内の既に受信準備ができているメッセージの status は 1 です。RECEIVE ステートメントでは、status が 1 のメッセージが返されます。RECEIVE ステートメントによってメッセージが返された後、そのメッセージの保有が指定されている場合は、status が 0 に設定され、キューに残されます。メッセージの保有が指定されていない場合、RECEIVE ステートメントはメッセージをキューから削除します。キューを使用するサービスは、受信メッセージと送信メッセージの両方を保存します。この場合、SEND コマンドは、status3 を設定してサービスのキューにメッセージをコピーし、そのメッセージを転送キューにも追加します。メッセージ交換が終了すると、キューはこのメッセージ交換に関するすべてのメッセージを削除します。

アプリケーションは、同じメッセージを 2 回受信できません。また、送信メッセージとしてキューに追加されたメッセージを受信することもできません。保持されているメッセージを操作するには、SELECT ステートメントを使用して、キューにクエリを実行します。監査を目的とする場合、保持されているメッセージを監査テーブルに挿入してから、メッセージ交換を終了します。補正トランザクションの場合、通常、アプリケーションは、処理済みのメッセージを新しいものから古いものへ順番に操作し、各メッセージの動作を順番に元に戻します。これを、すべてのメッセージが処理されるまで続行します。

SELECT ステートメントを使用してキューにアクセスする方法の詳細については、「キューに対するクエリの実行」を参照してください。