私が構築しなかったプロセスを調べています。サービスブローカーを使用して連絡先のキューを作成し、それに対してアクションを必要とします。SQL Server Service Brokerデッドロック
10kレコードを受け取り、処理するストアドプロシージャに渡すハンドラがあります。
最終処理でエラー処理が行われずにデッドロックが発生した場合はどうなりますか?これらはキューに戻ってきますか?もし彼らが待ち行列に戻るようにするには、私は何をする必要がありますか?
私が構築しなかったプロセスを調べています。サービスブローカーを使用して連絡先のキューを作成し、それに対してアクションを必要とします。SQL Server Service Brokerデッドロック
10kレコードを受け取り、処理するストアドプロシージャに渡すハンドラがあります。
最終処理でエラー処理が行われずにデッドロックが発生した場合はどうなりますか?これらはキューに戻ってきますか?もし彼らが待ち行列に戻るようにするには、私は何をする必要がありますか?
サービスブローカキューは、トランザクション内からアクセスできます。
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は処理不能なメッセージがあるとみなしてキューをシャットダウンします。それは起こる悪い日です。
プロセスにデッドロックをかけて、何が起こるのか見てみましたか? – dfundako
いいえ、残念ながら私は現時点でライブサーバーにいます。私は誰かがこれに対する標準的な行動があるかどうかを知ることを望んでいました。私は検索時に矛盾するレポートを見ていましたが、標準的な動作をテストするための新しいプロセスの作成を避けたいと思います。 **標準の動作**が**ある場合です。 –
これがすべてトランザクション内にあれば、ロールバックされます。そうでなければ、あなたは持っている: 'peek' - done、' process' - 失敗する。別々の取引として。 –