QUESTION(SQ0110024)
SQL Remoteでの競合の解決方法
ANSWER
競合とは
複数ユーザーによる同一カラムの更新の事です。
競合解決方法 後のユーザのオペレーションが成功すると、データが適切に変更されるように競合を解決するためのトリガが起動されます。
UPDATE 文の競合の検出
UPDATE 文は、既存の 1 つまたは複数のローの値を新しい値に変更します。変更されるローは、UPDATE 文の WHERE 句によって異なります。SQL Remote が UPDATE 文をレプリケートする場合、複数のシングル・ロー更新をセットにまとめて行います。これらのシングル・ロー文は、次のいずれかの理由で失敗する場合があります。
-
【更新するローが存在しない】
-
個々のローはそのプライマリ・キー値によって識別されるため、プライマリ・キー値が他のユーザによって変更された場合、更新すべきローが見つかりません。
この場合、UPDATE 文は何も更新しません。
-
【更新するローが 1 つまたは複数のカラムで違っている】
-
存在するはずの値の 1 つが他のユーザによって変更された場合、「更新の競合」が発生します。リモート・データベースでは、ローの値に関わらず更新が実行されます。統合データベースでは、SQL Remote によって「競合解決」オペレーションが実行されます。競合解決オペレーションは、トリガまたはストアド・プロシージャ内に格納され、競合が検出されると自動的に実行されます。
Adaptive Server Anywhere
では、競合解決トリガは更新の前に実行され、このトリガが終了すると更新が実行されます。
-
【主キー制約または一意性制約のないテーブルはレプリケートされた更新のWHERE
句のすべてのカラムを参照する】
-
2人のユーザが同じローを更新する場合、レプリケートされた更新は更新作業を行わず、データベースの整合性が失われます。したがって、レプリケートされたすべてのテーブルに主キー制約または一意性制約を持たせ、制約対象のカラムが更新されないようにする必要があります。
競合が検出された場合
SQL Remote では、「競合解決トリガ」を定義して UPDATE
競合を処理できます。競合解決トリガは、リモート・ユーザがメッセージを適用する場合に、統合データベースでのみ起動されます。統合データベースで
UPDATE 競合が検出されると、次の順序でイベントが実行されます。
-
オペレーションに対して定義された、すべての競合解決トリガが起動されます。
-
UPDATE が実行されます。
-
UPDATE だけでなくそのトリガのすべてのアクションが、リモート・データベース全部にレプリケートされます。この中には、その競合をトリガするメッセージを送信した、リモート・データベースも含まれます。
通常、Adaptive Server Anywhere の SQL
Remote
は、トリガ・アクションをレプリケートしません。トリガがリモート・データベースにあることを想定しているからです。競合解決トリガは統合データベースでのみ起動されるため、このトリガ・アクションはリモート・データベースにレプリケートされます。
-
リモート・データベースでは、統合データベースからのメッセージに
UPDATE競合が含まれていると、RESOLVE UPDATE トリガは起動されません。
-
UPDATE
がリモート・データベースで実行されます。
プロセスの最後では、セットアップを通してデータの一貫性が保たれます。データが読み取り用に共有されていても、各ロー (プライマリ・キーによって識別される)が 1 つのサイトだけで更新される場合は、UPDATE 競合は発生しません。複数のサイトでデータが更新された場合にのみ、この競合が発生します。
|