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

SQL Anywhere 12.0.1 » Mobile Link サーバー管理 » Mobile Link サーバーテクノロジ » 同期の方法 » 競合の解決 » 競合検出

 

upload_fetch または upload_fetch_column_conflict スクリプトによる競合の検出

テーブルに対して upload_fetch または upload_fetch_column_conflict スクリプトを定義すると、Mobile Link サーバーは、アップロードされた更新の更新前イメージを、スクリプトから返される、同じプライマリキー値を持つローの値と比較します。更新前イメージの値が統合データベースの現在の値と一致しない場合、Mobile Link サーバーは競合を検出します。サーバーは upload_old_row_insert スクリプトと upload_new_row_insert スクリプトを呼び出し、その後、競合を検出した場合に resolve_conflict スクリプトを呼び出します。

注意

競合中に upload_old_row_insert スクリプトと upload_new_row_insert スクリプトが定義されていない場合はエラーが発生します。同期テーブルにこれらのスクリプトが必要ない場合は、--{ml_ignore} 文を使用してこれらのスクリプトを無視するものとして定義します。

upload_fetch スクリプトと upload_fetch_column_conflict スクリプトの違いは、Mobile Link サーバーが競合の検出に使用する基準にあります。upload_fetch スクリプトを使用した場合、フェッチされたローと更新前イメージのローの相違は競合として処理されます。upload_fetch_column_conflict スクリプトを使用した場合は、フェッチされたローと更新前イメージのローの間で、リモートデータベースによって更新されたカラムのみが比較されます。つまり、upload_fetch はローベースの競合検出を実行し、upload_fetch_column_conflict はカラムベースの競合検出を実行します。

upload_fetch スクリプトは、更新対象となるローに対応する統合データベースのテーブルから、データの単一のローを選択します。このスクリプトを使用するには、次の 2 つの方法があります。1 つは、アップロードされた更新前イメージと同じプライマリキーと同じカラム値を持つローを選択する方法です。ローが返されない場合、Mobile Link サーバーは競合を検出します。スクリプトのこの使用方法では、構文は次のようになります。

SELECT pk1, pk2, ...col1, col2, ...
FROM table-name
WHERE pk1 = {ml r.pk1} AND pk2 = {ml r.pk2} ...
   AND col1 = {ml o.col1} AND col2 = {ml o.col2} ...
注意

この競合検出方法は、BLOB や CLOB などの大きなバイナリカラムを含む同期テーブルでは使用できません。

もう 1 つは、同じプライマリキーを持つローを選択し、Mobile Link サーバーがフェッチされたローをアップロードされた更新前イメージと比較できるようにする方法です。カラムが異なる場合、Mobile Link サーバーは競合を検出します。この方法は、すべての同期可能なカラムタイプで使用できます。

SELECT pk1, pk2, ...col1, col2, ...
FROM table-name
WHERE pk1 = {ml r.pk1} AND pk2 = {ml r.pk2} ...

upload_fetch テーブルイベントを参照してください。

upload_fetch_column_conflict イベントは upload_fetch と似ていますが、upload_fetch_column_conflict では、最後の同期以降にリモートデータベースと統合データベースで同じカラムが更新された場合にのみ Mobile Link サーバーがローの競合を検出するという点が異なります。異なるユーザーは、同じカラムを更新しないかぎり、同じローを更新することができ、競合は発生しません。upload_fetch_column_conflict イベントは、BLOB がない同期テーブルにのみ適用できます。

upload_fetch_column_conflict スクリプトを使用し、競合が検出されない場合、upload_update スクリプトに渡されるロー値は、upload_fetch_column_conflict スクリプトによってリモートデータベースのアップロードまたは現在の統合値から取得されます。リモートデータベースで更新されたカラムにはリモートデータベースの値が使用されます。それ以外の場合は現在の統合値が使用されます。つまり、リモートデータベースで更新されたカラムのみが統合データベースで更新されます。

upload_fetch_column_conflict テーブルイベントを参照してください。

リモートデータベースのテーブルごとに、upload_fetch または upload_fetch_column_conflict スクリプトを 1 つのみ指定できます。

 統合データベースのローのロック
 例