2017-01-13 5 views
0

ProductId、Name、Priceを定義するProductsテーブルがあるシナリオを想像してみてください。 また、InvoicesHeaderテーブルとInvoicesLinesテーブルがあり、ユーザーが請求書を作成して項目を追加するといっぱいになります。SQLオプティミスティック同時実行性 - データベース間に複数のテーブルを含める

InvoicesLineテーブルは、ItemProductId FKを介してProductsテーブルを参照していましたが、そのItemのFieldテーブルには値が設定されていましたが、そのアイテムのProductsテーブルに格納されていました。

  1. ユーザAは、請求書の作成を開始し、アイテムを請求するProductXを追加します。

    さて、このような場合があるかもしれません。 Productsテーブルの項目の価格が

  2. ユーザAは、ユーザAは、(最後にすべてを一度に保存されている)、請求書を終了する前にユーザーBがProductsテーブルに行くとProductX
  3. の料金を変更する他の項目
  4. を追加することになりますが読み込まれます
  5. userAは今すぐ請求書を送信します

値が変更されたことを(「請求書を保存」をクリックすると)通知されることが望ましい結果となります。 これを実現するベストプラクティスは何ですか?

1つの選択肢は、Productsテーブルにrowversions/timestampsを設定し、それらをUIに取得して広告申込情報とともに返送することです。したがって、請求書を保存する際には、まず、行品目と対応する商品テーブルレコードのロバートションが損なわれていないかどうかを確認します。そうであれば>続行し、そうでなければ>ユーザーに通知します。 また、SaveInvoicesトランザクションの場合、REPEATABLE_READを保留する必要があります。商品のテーブル行の分離レベルは、項目を請求書に保存する際に価格が変更されないことを保証します。

これはちょっと面倒な感じがするので、よりエレガントなやり方があるのだろうかと思います。

答えて

0

ProductテーブルにLastValueModifiedDate datetime列を追加し、値が変更されるたびに更新します。
したがって、請求書を保存する場合:

各製品のLastValueModifiedDateの現在の日付時刻<の場合は保存しても問題ありません。

cureent datetime> =少なくとも1つの製品のLastValueModifiedDateの場合、どの製品の値が変更されたかをユーザーに通知できます。

+0

私は何らかの理由で日時計に行くことを非常に気にしません。あるもの:日時の精度問題、タイムゾーン、夏時間など...私は、その比較が間違っている日時の予測不可能な数を見ることができます。私が間違っている場合は私を修正してください。 –

+0

すべてのdatetimesはSQL Serverのdatetime(getdate()は値の変更時にProductに格納され、getdate()はこの保存された日付と比較されるべきです)。ユーザークライアントのdatetimeはありません。 – shadow

+0

少なくとも、その場合はgetutcdate()を使用したいと思います。また、あなたのDSTが後退するとどうなりますか? –

関連する問題