0

PayPalからいわゆるIPNメッセージを受信するとき、データベースの行を更新する必要があります。

問題は、完全な信頼性が必要なことです。

現在、私はInnoDBを使用しています。競合状態が原因で取引が失敗する可能性があります。

使用する必要がありますLOCK TABLESか?他の信頼できる解決策はありますか?

失敗をチェックして、トランザクションを数回(何回?)繰り返す必要がありますか?

4

1 に答える 1

1

順序に関係なく、分散プロセス (ローカルで行を追加し、サーバーにリモートで通知するなど) を完全に信頼できるものにすることはできません。これは、Two General's Problemによく似ています。メッセージが途中で失われる可能性があるため、両側で同時にトランザクションが正常に完了したことを示す単一のイベントはありません。

あなたの問題を正しく理解しているかどうかはわかりませんが、おそらく次のようにすればうまくいくでしょう:与えられたメッセージを検証しようとしているという事実を示す行をテーブルに書き込みます。次に、検証を行い、その後、その検証の結果についてデータベースに行を書き込みます。ありそうもないが重要なシナリオで何かが中断した場合、一致する結果の行がない意図の行が表示されます。その後、そのような状況を検出し、手動で回復できます。

ローカル データベースでは、おそらく自動コミットがオンになっている場合でも、独自のトランザクションで実行できる単一行の更新があります。PayPal サーバーとの通信を開始する前に、最初の書き込みが実際にディスクにコミットされていることを確認する必要があります (できれば、他のディスクのバイナリ ログも)。ただし、ロックなどの必要はないと思います。失敗したトランザクションは 3 回まで再試行する必要がありますが、重要なことは、最終的に管理者の介入により、コードで処理できないものを修正できるということです。

于 2012-10-07T18:35:44.027 に答える