ちょっと自分の疑問を考える時間がありました。ここで私は今何を考えている:
問題の手順を送信する電子メールは以下の通りであった。
- データベース
- に挿入し、電子メールに
- を送るので、メールがトランザクションにすることはできません
をコミットステップ#2(上記)は、トランザクションがアクティブである間に完了しても、トランザクションの一部ではありません。
これらの手順を実行すると、失敗した電子メール送信試行が再試行されますが、電子メールが複数回送信されないことを保証することはできません。この状況は、電子メール送信エンジンがトランザクション対応である場合にのみ向上する可能性があります。このようなエンジンは、(少なくとも)次の操作を行います:
- は、電子メールのジョブ投入を受け入れるが、コミットが
- 実行されるまで電子メールが送信されない場合、コミットが失敗してください電子メールを送信しません。トランザクションはロールバックされている場合
- が投入されたジョブをキャンセルし
私はそのような電子メールサーバーを認識していないです。彼のanswerで
Nishantは、次の手順を提案:
- は、メールを送信する前にデータを挿入します。状態を送信に設定する
- メールを送信するには、手順(2)の結果に基づいて
- に基づいて、行を失敗または送信に更新します。上述のように
これらの手順はまた、同じ理由で、スクリプトのタイムアウトに電子メールの送信の重複を確保することはできません。
これまでのところ、私はちょうど重複した電子メールで生きなければならないと思う。
なぜDB経由で送信されたメールを追跡しないのですか?あなたは電子メールを再送しないように?また、例外処理 'try/catch'メソッドでタイムアウトを処理するようにしてください。 – Jakub
@Jakub、Webサーバーが起動したスクリプトが長時間実行されていると判断した場合、スクリプトのタイムアウトを参照していました。私はこのシナリオでtry/catchが役立つかどうかわかりません –
あなたはそれがタイムアウトになっていることをどのような電子メールで送信していますか?または、これは単にあなたがいくつかの電子メールで気づいた副作用ですか?好奇心と、そのシナリオで試して/キャッチは助けにはならないでしょう。 – Jakub