4D v16

SYNCHRONIZE

ホーム

 
4D v16
SYNCHRONIZE

SYNCHRONIZE  


 

 

SYNCHRONIZE
[LOCAL] TABLE table_reference (column_reference_1,...,column_reference_N)
WITH
[REMOTE] TABLE table_reference (column_reference_1,...,column_reference_N)
FOR REMOTE [STAMP] {int_number | 4d_language_reference},
LOCAL [STAMP] {int_number | 4d_language_reference}
{REMOTE OVER LOCAL | LOCAL OVER REMOTE}
LATEST REMOTE [STAMP] 4d_language_reference,
LATEST LOCAL [STAMP] 4d_language_reference;

説明  

SYNCHRONIZEコマンドを使用して異なる2つの4D SQLサーバ上に存在する2つのテーブルを同期できます。いずれかのテーブルに対して行われた変更は他方のテーブルに対しても実行されます。コマンドを実行する4D SQLサーバはローカルサーバと呼ばれ、他方のサーバはリモートサーバと呼ばれます。

SYNCHRONIZEコマンドはREPLICATEコマンドを内部的に2回呼び出したものです。一回目の呼び出しでリモートサーバからのデータをローカルサーバに複製し、二回目の呼び出しでローカルサーバのデータをリモートサーバに複製します。なので同期されるテーブルは複製用に設定されていなければなりません:

  • テーブルは主キーを持っていなければなりません。
  • "複製を有効にする"オプションが各テーブルのインスペクタウィンドウでチェックされていなければなりません。

詳細はREPLICATEコマンドの説明を参照してください。

SYNCHRONIZEコマンドは4つのスタンプ2つの入力スタンプと2つの出力スタンプ (最新の更新) を"引数"として受け入れます。入力スタンプはそれぞれのサーバ上での最新の同期の時期を示すために使用されます。この時期はコード化された情報として、継続時間なしで表現されます。出力スタンプは最新の更新直後のそれぞれのサーバ上での更新スタンプの値を返します。この原則により、SYNCHRONIZEコマンドが定期的に呼ばれるとき、次回の入力スタンプとして、最新の同期の出力スタンプを使用できます。

: 入力および出力スタンプは数値として表現され、タイムスタンプとはなりません。これらのスタンプについてはREPLICATEコマンドの説明を参照してください。

エラーが発生すると、関連するサーバの出力スタンプには、エラーのもととなったレコードのスタンプが戻されます。エラーが同期以外の原因で引き起こされた場合 (例えばネットワークの問題など)、スタンプは0となります。
異なる2つのエラーコードがあります。1つはローカルサイトでの同期エラーを示すもので、もう1つはリモートサイトでの同期エラーを示します。
エラーが発生すると、データの状態はローカルサーバのトランザクションの状態に依存します。リモートサーバ上で、同期は常にトランザクション内で実行されるので、処理によりデータが変更されることはありません。しかしローカルサーバ上では、同期処理は開発者の制御下にあります。自動コミットトランザクション環境設定が選択されていない場合、トランザクションの外で処理が実行されます (選択されていればトランザクションコンテキストが自動で作成されます)。開発者はトランザクションを開始するか決定でき、データの同期後にこのトランザクションを有効にするかキャンセルするかも開発者に任されています。

REMOTE OVER LOCALLOCAL OVER REMOTE句を使用して、アプリケーションの特性に応じて、同期の方向を強制的に指定できます。実装メカニズムについてはREPLICATEコマンドの説明を参照してください。
   
注: SYNCHRONIZEコマンドで実行される処理はデータ整合性制約を考慮に入れません。これは例えば外部キー、重複不可等を管理するルールが検証されないことを意味します。受信したデータがデータ整合性を壊す可能性がある場合、複製処理終了後にデータを検証する必要があります。もっとも簡単な方法は4DまたはSQLランゲージを使用して更新されるレコードをロックすることです。

4Dは LATEST REMOTE STAMPLATEST LOCAL STAMP 句の 4d_language_ref 変数にそれぞれ、リモートおよびローカルの最後のスタンプ値を返します。この情報を使用して同期処理を自動化できます。これらの情報は同期処理終了直後のスタンプ値に対応します。そのあとの REPLICATESYNCHRONIZE 文でこれらを使用する場合、値をインクリメントする必要はありません。REPLICATE コマンド実行後、自動でインクリメントされています。

例題  

同期処理に関連するメカニズムを理解するために、同期された2つのデータベース両側で既存のレコードが変更されたケースを考えます。

同期に使用されるメソッドは以下の形式です:

 C_LONGINT(vRemoteStamp)
 C_LONGINT(vLocalStamp)
 C_LONGINT(vLatestRemoteStamp)
 C_LONGINT(vLatestLocalStamp)
 
 vRemoteStamp:=X... // 後述の表中の値参照
 vLocalStamp:=X... // 後述の表中の値参照
 vLatestRemoteStamp:=X... // 前回のLATEST REMOTE STAMPに返された値
 vLatestLocalStamp:=X... // 前回のLATEST LOCAL STAMPに返された値
 
 Begin SQL
    SYNCHRONIZE
        LOCAL MYTABLE (MyField)
        WITH
        REMOTE MYTABLE (MyField)
        FOR REMOTE STAMP :vRemoteStamp,
        LOCAL STAMP :vLocalStamp
        LOCAL OVER REMOTE  // または REMOTE OVER LOCAL, 後述の表参照
        LATEST REMOTE STAMP :vLatestRemoteStamp,
        LATEST LOCAL STAMP :vLatestLocalStamp;
 End SQL

初期のデータは以下の通り:

  • LOCALデータベースのレコードスタンプは値が30で、REMOTEデータベースのレコードスタンプ値は4000。
  • MyField フィールドの値は以下の通り:
    LOCALREMOTE
    古い値新しい値古い値新しい値
    AAABBBAAACCC
  • 最後の同期以降に変更された値のみを同期するために、前回の LATEST LOCAL STAMPLATEST REMOTE STAMP 句に返された値を使用する。

LOCAL STAMPREMOTE STAMP に渡された値や使用される優先度オプションに基づき SYNCHRONIZE コマンドにより実行される同期は以下のようになります: ROL = REMOTE OVER LOCAL、LOR = LOCAL OVER REMOTE:

LOCAL STAMPREMOTE STAMP優先度同期後のローカルデータ同期後のリモートデータローカル - リモート同期の方向
203000ROLCCCCCC<---->
203000LORBBBBBB<---->
313000ROLCCCCCC<--
313000LORCCCCCC<--
204001ROLBBBBBB-->
204001LORBBBBBB-->
314001ROLBBBCCC同期なし
314001LORBBBCCC同期なし
403000ROLCCCCCC<--
403000LORCCCCCC<--
205000ROLBBBBBB-->
205000LORBBBBBB-->
405000ROLBBBCCC同期なし
405000LORBBBCCC同期なし



参照 

REPLICATE

 
プロパティ 

プロダクト: 4D
テーマ: SQLコマンド

 
履歴 

 
ARTICLE USAGE

SQLリファレンス ( 4D v16)