テーブルに対して 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 スクリプトによる競合の解決を参照してください。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |