2016-07-21 17 views
0

私が構築しなかったプロセスを調べています。サービスブローカーを使用して連絡先のキューを作成し、それに対してアクションを必要とします。SQL Server Service Brokerデッドロック

10kレコードを受け取り、処理するストアドプロシージャに渡すハンドラがあります。

最終処理でエラー処理が行われずにデッドロックが発生した場合はどうなりますか?これらはキューに戻ってきますか?もし彼らが待ち行列に戻るようにするには、私は何をする必要がありますか?

+0

プロセスにデッドロックをかけて、何が起こるのか見てみましたか? – dfundako

+0

いいえ、残念ながら私は現時点でライブサーバーにいます。私は誰かがこれに対する標準的な行動があるかどうかを知ることを望んでいました。私は検索時に矛盾するレポートを見ていましたが、標準的な動作をテストするための新しいプロセスの作成を避けたいと思います。 **標準の動作**が**ある場合です。 –

+0

これがすべてトランザクション内にあれば、ロールバックされます。そうでなければ、あなたは持っている: 'peek' - done、' process' - 失敗する。別々の取引として。 –

答えて

1

サービスブローカキューは、トランザクション内からアクセスできます。

begin tran 
    receive top(10000) message_body 
    into @table 
    from dbo.yourQueue; 

    while(1=1) 
    begin 
     select top(1) @message = message 
     from @table; 
     if (@message is null) 
     break; 
     exec dbo.processMessage @message; 
    end 
commit tran 

...そしてあなたが設定している:;あなたのコードでは、このような何かを行うのであれば(実際の堅牢なサービスブローカーコードは少しあなたの質問の範囲を超えて、以下の擬似コードです)。私が言っていることは、あなたがreceiveを実行していて、同じトランザクションで処理している限り、すべてのエラー(デッドロックを含む)がトランザクションをロールバックし、メッセージをキューに戻すということです。あなたは有害なメッセージの取り扱いについて読んでください!ロールバックが多すぎると、SQLは処理不能なメッセージがあるとみなしてキューをシャットダウンします。それは起こる悪い日です。

関連する問題