0

私とクライアントに毎日午前中にメールを送信するシステムがあります。このプロセスは、iframe 経由で私の Web サイトにアクセスすることで自動的にトリガーされます。

同じメールが 2 回届くことがよくあります。

これを制御するために MySQL データベースで作成した簡単なプロセスは次のとおりです。

次のクエリを実行します。

メールを送信するクライアントを選択

SELECT name, email FROM clients WHERE DATE_FORMAT(lastsend, '%d/%m/%y') <> DATE_FORMAT(now(), '%d/%m/%y')

メール送信機能

メールの送信にvb.netを使用しています

すべてのメールを送信した後にテーブル クライアントを更新する

UPDATE clients SET lastsend = Now();

同じメールが同じ日に複数回送信されないように、これをロックする方法が必要です。

ありがとう、

4

1 に答える 1

1

あなたが持っているのは競合状態です。これを解決するには多くの方法がありますが、他の方法よりも堅牢なものもあります。「堅牢」とは、電子メールが重複しないことを保証することを意味します。

これが簡単な方法です。テーブルに 2 番目の日付列を追加します: SendStart. メールを送信する前にsend start を now() に設定し、WHERE 句を次のように変更します。

WHERE DATE_FORMAT(lastsend, '%d/%m/%y') <> DATE_FORMAT(now(), '%d/%m/%y') and
      DATE_FORMAT(sendstart, '%d/%m/%y') <> DATE_FORMAT(now(), '%d/%m/%y')

最初のクエリと 2 番目のクエリの間で競合状態が発生する可能性があります。ただし、期間ははるかに短いため、可能性ははるかに小さくなります。

最後に、電子メールが送信された日時と、送信されたかどうかの両方の記録があります (送信が成功しない限り、lastsend を設定しないでください)。失敗した電子メールに対して、バッチ レポートとエラー処理を実行できます。

于 2012-09-08T16:50:36.717 に答える