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

SQL Anywhere 11.0.1 (日本語) » Mobile Link - クイック・スタート » Mobile Link チュートリアル » チュートリアル:スクリプトの作成と同期のモニタリング

 

レッスン 6:競合検出と競合解決のためのスクリプトの作成

競合は、統合データベースにローをアップロードしているときに発生します。異なるリモート・データベースで 2 人のユーザが同じローを修正した場合、Mobile Link サーバに 2 つめのローが到着したときに競合が検出されます。同期スクリプトを使用すると、競合を検出して解決できます。

Mobile Link での競合解決の詳細については、競合の解決を参照してください。

例 (在庫管理)

現場に販売担当者が 2 人いるとします。最初の在庫数は 10 個で、販売担当者 1 はそのうちの 3 個を販売しました。この担当者は、リモート・データベース remote1 に記録されている在庫数を 7 に更新します。販売担当者 2 は 4 個を販売し、remote2 に記録されている在庫数を 6 に更新します。

Mobile Link 同期クライアント・ユーティリティを使用して remote1 の同期が実行されると、統合データベース内の在庫数は 7 に更新されます。remote2 の同期が実行されると、競合が検出されます。これは、統合データベース内の在庫数が変更されているためです。

この競合をプログラムで解決するには、次のような 3 つのロー値が必要となります。

  1. 統合データベースにある現在の値。

    remote1 の同期が実行された後の統合データベース内の値は 7 です。

  2. Remote2 がアップロードした新しいローの値。

  3. 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 テーブル・イベントを参照してください。

♦  競合の検出と解決のためのスクリプトをインストールするには、次の手順に従います。
  1. Interactive SQL を起動します。

    1. コマンド・プロンプトで dbisql と入力します。

    2. [ID] タブをクリックします。

    3. [ユーザ ID] フィールドに DBA と入力します。

    4. [パスワード] フィールドに sql と入力します。

    5. [データベース] タブをクリックします。

    6. [サーバ名] フィールドに cons と入力します。

    7. [OK] をクリックします。

  2. 競合の検出と解決のためのスクリプトを実装します。

    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 統合データベースを参照してください。