4

バックグラウンド

PHP`(5.2)にPayPal IPNハンドラーがあり、トランザクションを処理して日付をMySQLデータベースに保存します。このサイトのアクティビティは少ないです。

MySQLクエリが失敗することがあります。(ごくまれに)すべてをログに記録します。PayPalメッセージの処理に失敗した場合は、ログファイルを調べて、PayPalメッセージを再送信できます。

アイデア/懸念

しかし、プロセスをもう少し堅牢にして、代わりにハンドラーにmysqlクエリを再試行させてからあきらめることができるかどうか疑問に思いました。

私はおそらく少し待ちたいと思います-すぐに複数のクエリの試行を打ち負かさないでください。

私はこれのいくつかのパターンを見つけることを望んでいました-「phpmysqlqueryretry」のようなものを検索してもあまり成功しませんでした。

質問

  1. このための良い実践ガイドはありますか?

  2. 既存の図書館?

  3. 単純なループとsleep各クエリの試行の間は問題ありませんか、それとも望ましくない副作用が発生する可能性がありますか?ネイティブすぎますか?

4

1 に答える 1

3

PHP の世界ではトランザクションセーフなコードは標準ではありませんが、Java や .net のコードサンプルを見ると多くの例があります。

私が見た中で最も優れたデータベース コードは、クエリを関数に入れ、あきらめてログ/キューに入れる直前に約 3 回再試行します。うまくいけば、それはあなたの問題を処理します.

ベスト プラクティスは、innodb テーブルを使用し、すべての重要な SQL ステートメントをコミットまたはロールバックされるトランザクションに入れることです。そうすれば、1 つの特定のクエリが失敗した場合でも、データは一貫した状態になります。(注意しないと、ロックの問題が悪化する可能性があることに注意してください)。

ユーザーのブラウザがハングアップする可能性があるため、ポーリングで長時間スリープ状態にしないでください。購入が完了したことを確認するために、すぐに返信する必要があります。ジョブを cron ジョブまたはサーバー デーモンを使用してキューに入れることも別の方法ですが、ユーザーにすぐにフィードバックを与えることはできず、おそらくこの目的にはやり過ぎです。

すぐに再試行してもうまくいかない場合は、別の種類の根本的なロックの問題があり、ワークアウトが必要な失敗の理由です。

于 2012-12-13T16:07:19.293 に答える