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 サーバ・テクノロジの使用 » 同期の方法 » 競合の解決 » 競合の検出

 

upload_fetch スクリプトによる競合の検出

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

upload_fetch スクリプトは、更新対象となるローに対応する統合データベースのテーブルから、データの単一のローを選択します。通常の upload_fetch スクリプトの構文は次のとおりです。

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

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

upload_fetch_column_conflict イベントは upload_fetch に似ていますが、2 人のユーザが同じカラムを更新した場合のみ競合を検出します。異なるユーザは、同じカラムを更新しないかぎり、同じローを更新することができ、競合は発生しません。

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

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

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

upload_fetch スクリプトによって競合が検出されてから、競合解決が完了するまでに、統合データベースのローが変更される可能性があります。データが正しくなくなる可能性があるこの問題を回避するには、ロー・ロックを使用して upload_fetch スクリプトまたは upload_fetch_column_conflict スクリプトを実装できます。

SQL Anywhere 統合データベースでは、UPDLOCK キーワードと HOLDLOCK キーワードのどちらも使用できますが、同時実行性については UPDLOCK の方が適しています。次に例を示します。

SELECT column-names from table-name WITH (UPDLOCK) 
  WHERE where-clause

Oracle、DB2 LUW、DB2 メインフレームの場合は、FOR UPDATE を使用します。次に例を示します。

SELECT column-names FROM table-name
  WHERE where-clause
    FOR UPDATE OF column_name1, column_name3, column_name6
注意

更新するカラム名を上の例のように指定すると、コンピュータのリソースが保持され、パフォーマンスが向上します。

Microsoft SQL Server の場合は、HOLDLOCK を使用します。次に例を示します。

SELECT column-names FROM table-name WITH (HOLDLOCK)
  WHERE where-clause

Adaptive Server Enterprise の場合は、HOLDLOCK を使用します。次に例を示します。

SELECT column-names FROM table-name
  HOLDLOCK 
  WHERE where-clause

upload_fetch スクリプトを定義します。Mobile Link サーバはこのスクリプトを使用して、統合データベースの現在のローを取り出し、更新されたローの更新前イメージとこのローを比較します。2 つのローに同じ値が含まれている場合、競合はありません。2 つのローが異なる場合には、競合が検出され、Mobile Link は upload_old_row_insert と upload_new_row_insert スクリプトを呼び出し、その後に resolve_conflict スクリプトを呼び出します。

resolve_conflict スクリプトによる競合の解決を参照してください。