私はDBAなので、私の応答にフレーバーがありますが、これが私がすることです:
- SQL 2005以降を使用している場合は、メッセージをテーブルに保存するのではなく、ServiceBrokerを使用してデータベースに保存します。これでキューイングメカニズムが得られるので、MSMQを取り除くことができます。テーブルもありますが、会話ハンドル(基本的にはメッセージへのポインタ)と、このメッセージを試行した回数が格納されます。最後に、再試行のしきい値に達したメッセージが送信される、ある種の「デッドレターボックス」が必要になります。
- メッセージ処理コードで、次の手順を実行します。
- トランザクションを開始します
- キューからメッセージを受信する
- 再試行回数がしきい値よりも大きい場合は、デッドレターボックスに移動してコミットします
- このメッセージのテーブルのカウンターを増やします
- メッセージを処理する
- 処理が成功した場合は、トランザクションをコミットします
- 処理が失敗した場合は、同じ内容の新しいメッセージをキューに入れてから、トランザクションをコミットします
計画されたロールバックがないことに注意してください。 ServiceBrokerでのロールバックは悪い場合があります。受信に成功せずに5回ロールバックすると、キューはエンキューとデキューの両方で無効になります。ただし、処理の途中でメッセージプロセッサが停止した場合(つまり、サーバーがクラッシュした場合)のトランザクションが必要です。