Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Remote » SQL Remote のレプリケーション設計 » SQL Remote のレプリケーション設計と設定 » 更新の競合 » トリガを使用したカスタム競合解決

 

在庫数の競合解決

スポーツ用品メーカのための倉庫システムがあるとします。製品情報のテーブルには、各製品の在庫数を記録する Quantity カラムがあります。このカラムへの更新は、通常は在庫数を引いていくことであり、新しく製品が搬入される場合は、在庫数を追加します。

リモート・データベースで営業担当者が受注を入力し、S サイズのタンクトップ T シャツの在庫を 5 枚差し引いて 28 から 23 としました。この在庫数も担当者のデータベースに入力されます。一方、この更新内容が統合データベースにレプリケートされる前に、別の営業担当者は T シャツの返品を 40 枚受け取りました。この営業担当者は、自分のリモート・データベースに返品を入力し、倉庫での変更を統合データベースにレプリケートして、Quantity カラムの値を 40 追加して 68 とします。

最初の更新で Quantity 列に 40 が追加されます。

このエントリがデータベースに追加され、現在の Quantity カラムは、在庫に 68 枚の S サイズのタンクトップ T シャツがあることを示しています。ここで最初の営業担当者からの更新を受信すると、28 から 23 に変更するという内容にもかかわらず、実際のカラム値は 68 であるという競合が SQL Anywhere で検出されます。

デフォルトでは、より新しい更新が処理され、在庫レベルが間違った値 23 に設定されます。

不適切な競合解決。2 番目の更新が最初の更新を不適切に上書きします。

この例の競合は、データベースの最終的な値が 63 になるように、在庫のカラムに対する変更を合計した結果を算出して解決してください。

正しい競合解決。2 番目の更新が最初の更新を修正します。
解決の実装

このような状況に適した RESOLVE UPDATE トリガでは、2 つの更新内容による増加分を追加します。次に例を示します。

CREATE TRIGGER resolve_quantity
 RESOLVE UPDATE OF Quantity
 ON "DBA".Products
 REFERENCING OLD AS old_name
  NEW AS new_name
  REMOTE AS remote_name
 FOR EACH ROW
 BEGIN
   SET new_name.Quantity = new_name.Quantity
                        + old_name.Quantity
                        - remote_name.Quantity
 END;

統合データベースの以前の値 (68) と、元の UPDATE 文が実行された時点のリモート・データベースの以前の値 (28) の差が、このトリガによって送信する新しい値に追加されてから、UPDATE 文が実行されます。したがって、new_name.Quantity は 63 (= 23 + 68 - 28) となり、この値が Quantity カラムに入力されます。

リモート・データベースでの一貫性は、次のように管理されます。

  1. 元のリモート UPDATE 文によって、値が 28 から 23 に変更されました。

  2. 倉庫システムのエントリがリモート・データベースにレプリケートされますが、以前の値が予測値と一致しないためにエラーが発生します。

  3. RESOLVE UPDATE トリガによる変更内容が、リモート・データベースにレプリケートされます。