2011-07-02 1 views
1

私のWebアプリケーション(Point of Sale)は、複数の支店で売上を処理します。各販売には固有の整数IDがあります。ブランチ1の一部の販売IDはnで、ブランチ2の次の販売はn +1です。webappがオフラインになったときの売買取引

ブランチがインターネット接続を失うと、セール情報がブラウザの内部データベースに保存されます。ここでセールスIDは最後のセールスIDに1を加えたものです。接続が復元されると、その情報をサーバーに送信し、それを実際のデータベースに格納します。

2つ以上のブランチがインターネット接続を失ったときにナイトメアが発生します。オフラインで販売してインターネットに戻ってくると、同じIDで2回の販売を受けることになります。これは、顧客のチケットがすでに印刷されているためです。

私の今の計画は、各販売IDに支店IDとその支店の実際の販売番号を混在させることです。したがって、ブランチ1の販売IDは1-1となり、ブランチ2からの次の販売は2-1となります。 brachが2つの売り場を持つまでは良いとは言えますが、これはあまり将来の証拠ではありません。

最高のアプローチは何だと思いますか?これを行うより良い方法はありますか?

答えて

1

単一のIDでIDの衝突を避けるための真に安全な方法は、サーバーが常にIDを割り当てていることだけです。 POSがオフラインになった場合は、ローカルで売り上げを記録するためのローカルIDとテンポラリIDを割り当て、POSがオンラインに戻ったら、サーバーから実際のIDをフェッチし、ローカルIDを実際のIDに変更してからトランザクションを送信します。私は一度、クライアント作成のIDとサーバー作成IDの正の数を表す負の数を使用するシステムを持っていました。サーバがネガティブIDを受け取ると、サーバIDを固有に作成されたサーバIDに変更し、そのIDをクライアントに返して、クライアントが実際のトランザクションIDでデータベースを更新できるようにします。

グローバルに一意のクライアント定義IDが必要な場合、各POSクライアントには、マルチパートの複合IDの一部となるサーバー割り当ての固有IDが必要です。次に、各クライアントは独自のカウンタを維持するだけで、固有のクライアントIDと組み合わせると常にグローバルに一意のIDになります。これは、すべてのクライアントに一意に割り当てられているclientIDという点を除いて、ブランチIDの概念の拡張です。そのため、各ブランチに複数のPOSクライアントを持つことができます。クライアントIDの割り当ては、クライアントのセットアップ時に手動で行うことも、設定または初期化処理中にサーバーに一意のclientIDを要求することにより、より動的に行うこともできます。

あなたにとって最も実用的な技術は、ここで説明したよりも多くのシステムに依存しますので、その知識に基づいて選択するか、システムの仕組みについて詳しく説明する必要があります私たちはより多くを助けることができるように。

0

説明した複合キーはこの問題の良い解決策です。分散した状況でキーの衝突を避ける必要があるときは、GUIDを使用する傾向があります。

+0

この場合、GUIDを使用している場合(GUIDを使用しないでください)、GUIDはクライアント側でのみ使用する必要があります。クライアントがサーバーと同期すると、サーバーは将来使用するための適切な識別子を割り当てることができます。 –

+0

@私はコンピュータにGUIDを処理させてくれますが、私よりもはるかに高速です。疑問があるときは、いつでもPKとしてintを介してGUIDを選択します。数十万の異なるソースからのデータを一緒にマッシュする時が来たら、すべてが1から始まるintを使用しなかったことを非常にうれしく思います。 – ScottS

1

理想的には、各販売時点では独自のIDがあります。たとえば、世界中の何千もの支店と各支店で15店までの販売店を持つ国際的な小売チェーン(ここでは名前は付けません)で働いていました。各POSには独自のIDが割り当てられていました。バックエンドシステムを認証するときにこのIDを使用しました。

この場合は、支店IDの代わりにPOS IDを使用する必要があります。これにより、同じ支店に複数のPOSがある場合、POS IDをトランザクションIDにプリペンドします。

関連する問題