競合は、統合データベースにローをアップロードしているときに発生します。異なるリモート・データベースで 2 人のユーザが同じローを修正した場合、Mobile Link サーバに 2 つめのローが到着したときに競合が検出されます。同期スクリプトを使用すると、競合を検出して解決できます。
Mobile Link での競合解決の詳細については、競合の解決を参照してください。
現場に販売担当者が 2 人いるとします。最初の在庫数は 10 個で、販売担当者 1 はそのうちの 3 個を販売しました。この担当者は、リモート・データベース remote1 に記録されている在庫数を 7 に更新します。販売担当者 2 は 4 個を販売し、remote2 に記録されている在庫数を 6 に更新します。
Mobile Link 同期クライアント・ユーティリティを使用して remote1 の同期が実行されると、統合データベース内の在庫数は 7 に更新されます。remote2 の同期が実行されると、競合が検出されます。これは、統合データベース内の在庫数が変更されているためです。
この競合をプログラムで解決するには、次のような 3 つのロー値が必要となります。
統合データベースにある現在の値。
remote1 の同期が実行された後の統合データベース内の値は 7 です。
Remote2 がアップロードした新しいローの値。
remote2 が直前の同期の間に取得した古いローの値。
この場合、次のビジネス論理を使用することで、新しい在庫数を計算して競合を解決できます。
current consolidated - (old remote - new remote) that is, 7 - (10-6) = 3 |
この式で、リモート・データベースの古い値からリモート・データベースの新しい値を引いて求めている値は、在庫数ではなく、販売担当者 2 が販売した個数です。
競合を検出して解決するには、次のスクリプトを追加します。
upload_update upload_update イベントは、リモート・データベースに挿入されたデータが統合データベースにどのように適用されるかを決定します。更新の競合の検出には、upload_update の拡張プロトタイプも使用できます。
upload_update を使用して競合を検出する方法の詳細については、競合の検出を参照してください。
upload_update の詳細については、upload_update テーブル・イベントを参照してください。
upload_old_row_insert このスクリプトは、リモート・データベースがその直前の同期で取得した古いロー値を処理するために使用できます。
upload_old_row_insert の詳細については、upload_old_row_insert テーブル・イベントを参照してください。
upload_new_row_insert このスクリプトは、新しいロー値 (リモート・データベースで更新された値) を処理するために使用できます。
upload_new_row_insert の詳細については、upload_new_row_insert テーブル・イベントを参照してください。
resolve_conflict 競合解決スクリプトは、競合の解決のためにビジネス論理を適用します。
resolve_conflict の詳細については、resolve_conflict テーブル・イベントを参照してください。
Interactive SQL を起動します。
コマンド・プロンプトで dbisql と入力します。
[ID] タブをクリックします。
[ユーザ ID] フィールドに DBA と入力します。
[パスワード] フィールドに sql と入力します。
[データベース] タブをクリックします。
[サーバ名] フィールドに cons と入力します。
[OK] をクリックします。
競合の検出と解決のためのスクリプトを実装します。
Interactive SQL で次のコードを実行します。
/* upload_update */ call ml_add_table_script( 'ver1', 'Product', 'upload_update', 'UPDATE Product SET quantity = ?, last_modified = ? WHERE name = ? AND quantity=? AND last_modified=?' ) go /* upload_old_row_insert */ call ml_add_table_script( 'ver1', 'Product', 'upload_old_row_insert', 'INSERT INTO Product_old (name,quantity,last_modified) values (?,?,?)') go /* upload_new_row_insert */ call ml_add_table_script( 'ver1', 'Product', 'upload_new_row_insert', 'INSERT INTO Product_new (name,quantity,last_modified) values (?,?,?)') go /* resolve_conflict */ call ml_add_table_script( 'ver1', 'Product', 'resolve_conflict', 'declare @product_name varchar(128); declare @old_rem_val integer; declare @new_rem_val integer; declare @curr_cons_val integer; declare @resolved_value integer; // obtain the product name SELECT name INTO @product_name FROM Product_old; // obtain the old remote value SELECT quantity INTO @old_rem_val FROM Product_old; //obtain the new remote value SELECT quantity INTO @new_rem_val FROM Product_new; // obtain the current value in cons SELECT quantity INTO @curr_cons_val FROM Product WHERE name = @product_name; // determine the resolved value SET @resolved_value = @curr_cons_val- (@old_rem_val - @new_rem_val); // update cons with the resolved value UPDATE Product SET quantity = @resolved_value WHERE name = @product_name; // clear the old and new row tables delete from Product_new; delete from Product_old ') |
SQL Anywhere 統合データベースの設定はこれで完了です。
Mobile Link での競合の検出と解決の詳細については、競合の解決を参照してください。
Mobile Link 統合データベースの詳細については、Mobile Link 統合データベースを参照してください。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |