1

ホテルを予約するためのウェブサイトがあります。予約が正常に完了すると、クライアントにメールが送信されます。私は次のようにそれをしました:

- Update table "booking"
- Check the result
   + If true, send email
   + Else return error

しかし、電子メールが送信されない場合はどうなりますか?DBが挿入されたが、電子メールが送信されなかったこと。それは予約操作が正しくないようにします。DB操作とメールトランザクションの送信方法は?それを行う簡単な方法はありますか?AとBは成功するか、いずれも成功しない必要があります。

4

4 に答える 4

6

厳密な意味でのトランザクションは、DB内で何かを拡張したり、DBで何かを拡張したりすることはできません。したがって、「トランザクション」を再定義して、すべてのアクションが失敗するか、すべてが成功するようにする必要があります。

ここにアイデアがあります:

  • DBトランザクションを開始します
    • テーブル「予約」を更新
    • ステータスが「更新済み、未送信」のUNDOレコードをテーブルに書き込みます。これには、予約を取り消すために使用できるIDが必要です
  • DBトランザクションをコミットする
  • これが失敗した場合は、救済します(ロールバックする必要はありません)

  • メールを送信する

  • これでうまくいけば
    • 元に戻すレコードを削除する
    • 「成功」を返す
  • そうしないと
    • 記録を元に戻すを使用して予約を元に戻す
    • 元に戻すレコードを削除する
    • 「エラー」を返す

理解すべきことが2つあります。

  • OSのクラッシュ、電源切れなどの場合は、取り消しテーブルを手動で確認して、メールサーバーのログと比較する必要があります。クラッシュは、メールが失敗したばかりか、メールが送信されたが記録されていない場合に発生した可能性があります。
  • 最も重要なこと:私は、電子メールが送信されたかどうかを確実に伝える迅速なメカニズムをまだ見ていません。私は本当に送られたという意味で、どこかに問い合わせられていません
于 2012-07-23T10:42:22.407 に答える
4

InnoDBを使用している場合は、データベーストランザクションを使用できます。

擬似コード:

Start DB transaction
Update table "booking"
Check the result
If true, send email
If email sends, commit your transaction
Else rollback your transaction, and return error

トランザクションの詳細については、http://dev.mysql.com/doc/refman/5.0/en/commit.htmlをご覧ください。

于 2012-07-23T10:34:08.747 に答える
2

しかし、電子メールが送信されない場合はどうなりますか?DBが挿入されたが、電子メールが送信されなかったこと。それは予約操作が正しくないようにします。DB操作とメールトランザクションの送信方法は?それを行う簡単な方法はありますか?AとBは成功するか、いずれも成功しない必要があります。

そうですね、トランザクションを開始し、データベースにデータを入力して、成功をテストします。成功した場合は、電子メールを送信します。データ入力と電子メールの送信の両方が成功した場合は、トランザクションをコミットします。どちらかが成功しなかった場合は、トランザクションをロールバックします。

そうは言った。電子メールが電子メールアドレスに正常に配信されたかどうかを判断する信頼できる方法はありません。受け入れサーバーのSMTPステータスコードを確認することはできますが、それはあなたの電子メールが後で返送されないことを保証するものではありません。

于 2012-07-23T10:37:03.947 に答える
0

status_flag DEFAULT 0これは、メインテーブルに列を追加することで実現できます

手順:

1. Update table "booking" SET col1 = val1, status_flag = 1 WHERE tr_id = "abc"

2. Send Email

3. Update table "booking" SET status_flag = 2 WHERE tr_id = "abc"

したがって、予約テーブルで値が1のレコードを見つけた場合status_flag、これらは電子メールの送信に失敗した可能性のあるレコードです。

したがって、同じスクリプトから電子メールを再送信するか、別のcronジョブスクリプトを追加して、失敗したエントリを特定し、それに応じてアクションを実行することができます。

于 2012-07-23T10:40:15.293 に答える