2012-02-09 9 views
1

私は現在、モバイルアプリからHTTP経由でアクセスしているAPIを構築しています。次のシナリオを想定します。モバイルアプリケーションは登録データを含むwww.example.com/customersにHTTP POSTリクエストを送信し、APIはデータベースに接続し、新しいレコードを挿入して200 OKといくつかのユーザー固有の登録データを返します。スポーティーな(モバイル)接続とAPIを扱う

ここで、データベースの挿入がうまくいったとしますが、200 OKレスポンスはモバイルアプリには行かなかったとします。接続/ユーザーがモバイル接続を無効にしたことはありません。同じPOSTリクエストを繰り返すことは明らかですそのユーザー名/ IDを持つユーザーが既に存在するためです。どうすればこの問題を解決できますか(同じメカニズムを使用してAPIの他の機能を保護します)?

また、私は上記のシナリオについて考えていましたが、ウェブサーバーとデータベースサーバーの間に同じ問題が発生する可能性がありますか?例:PHPスクリプトはmysql_connect()を呼び出して(リモート)データベースに接続し、mysql_query()への呼び出しが行われます。データベースサーバがクエリをコミットしたことがありますが、何らかの理由でPHPスクリプトが接続不良などのためにdb接続から「OK」を受け取ったことはありませんか?

+0

最初に、モバイルであるという事実を無視してください。トランザクションをどのようにアトミックにするかを考えてください。つまり、リモートデバイスが完了ステータスを制御していることを意味します。日。 – KevinDTimm

+0

@KevinDTimmあなたのご意見ありがとうございます。取引は私の問題ではありません。おそらく、私はあまり明確ではなかったでしょう。ある時点で、トランザクションは正常に完了し、リモート側は通知されることになっています。これが失敗した場合の対処方法は? (TCPレベルで)トランザクションが完了するのは重要ではないので、データベースの内容は変更される可能性が高いですが、誰にも通知されませんでした。 – biggiesmalls

答えて

0

プロセスが完了したかどうかを識別するために使用できるセッション変数を格納するか、ajax呼び出しのようなものを使用して、トランザクションが正常に記録されたときにのみレンダリングされる結果ページを繰り返しロードしようとします。

スクリプトとデータベース間の通信が行われる限り、ブラウザの接続状態に関係なくコードは実行され続けるため、コードは常にMySQLからの応答を得て、期待通りに実行を終了します。

+0

私の質問の最後の段落で、私はブラウザについて話していませんでした<-->ウェブサーバー接続。 mysql_queryが "COMMIT"をdbサーバに送信したとします(または1つの自動コミットされた文)。 mysqlサーバは、実行されたCOMMIT cmdに関するスクリプトに応答しようとしています。その時点で接続が失敗するとどうなりますか? – biggiesmalls

+0

その時点で、PHPによって例外がスローされ、手元に大きなインフラストラクチャの問題があります。 – PFY

+0

これに対処する方法はありますか? mysql_query()は失敗を返しますが、実際のクエリはこの場合にコミットされたことはありますか? – biggiesmalls

1

リクエストごとにトランザクションIDを使用して、実際のリクエストが完了したことを確認できます。

私は詳しく説明します。モバイルアプリのリクエストごとに、リクエストに応じてトランザクションIDを割り当てます。サーバーはアクションを実行し、完了したトランザクションを保存し、{"result":200、 "transaction":1234123}のようなメッセージを返します。

クライアントが(ネットワークの問題により)成功メッセージを受信しなかった場合、クライアントは同じトランザクションIDで要求を再送信します。サーバがメッセージを受信すると、トランザクションはすでに完了しており、それに応じてクライアントに応答することがわかります。

一意性を保証するために、トランザクションIDにはおそらくUUIDを使用するべきです。

+0

それはおそらく私が推測するノンスのいくつかの種類の、おそらく動作するだろう。私のAPIはカウンタを増減する機能も公開しています。これは、偶発的なinc./decへの重複HTTPリクエストの繰り返しを防ぐために使用できます。それらのカウンター。 – biggiesmalls

関連する問題