0

モバイルデータベースにローカルデータベースがあります。数分ごとに、デバイスはテーブルを調べ、RESTインターフェースを介して、アップロード済みとしてマークされていないデータをサーバーに送信します。表の例を次に示します。

id | name | phone | uploaded
1 | "bob" | "444" | 0

RESTインターフェースを介して送信されるのは次のとおりです。

name : "bob", phone : "444" 

サーバーは次のように応答します。

status : "OK"

この「OK」メッセージがモバイルデバイスによって受信されると、それらのレコードにとしてマークが付けられuploaded=1ます。これは、デバイスを実際に起こったことと一貫性を保つために正常に機能するはずです。問題は、サーバーがモバイルデバイスからこれらのメッセージのうち2つを(何らかの理由で)受信し、まったく同じデータを持つ2つのレコードをサーバーデータベースに挿入する可能性があることです。

これが発生しないようにする方法は何ですか?

サーバーデータベースのすべてのフィールドの一意性インデックスを考えましたが、もっと良い方法があるはずだと思います。

4

1 に答える 1

0

この問題は、サーバー側またはクライアント側で処理できます。

すでにお気づきのとおり、データベーステーブル(ID列など)にUNIQUE制約を追加するだけで、サーバーコンポーネントのレコードが重複するのを防ぐことができます。これにより、重複するメッセージをDBMSに保存しようとするたびに、データベースは文句を言います。

クライアント側では、モバイルデータベーステーブルにSTATE列を追加する必要があります。この列は、UPLOAD_PENDING、UPLOAD_IN_TRANSIT、およびUPLOAD_FINISHEDの3つの値のみをサポートする必要があります。この列は、UPLOADEDフィールドを置き換えるためのものであり、タプルが作成され(UPLOAD_PENDING)、すでにアップロードを開始し(UPLOAD_IN_TRANSIT)、アップロードが完了した(UPLOAD_FINISHED)ときに更新する必要があります。重複メッセージの問題を回避するために、新しいアップロードを開始する前に状態フィールドの値を確認する必要があります。

このアプローチのいずれかを選択できますが、両方を使用することを強くお勧めします。

于 2012-06-08T13:39:57.077 に答える