ここは旧式の4DドキュメントWebサイトです。最新のアップデートされたドキュメントを読むには新サイトをご利用下さい→ developer.4d.com |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v20 R7
SYNCHRONIZE
|
SYNCHRONIZE |
||
SYNCHRONIZEコマンドを使用して異なる2つの4D SQLサーバ上に存在する2つのテーブルを同期できます。いずれかのテーブルに対して行われた変更は他方のテーブルに対しても実行されます。コマンドを実行する4D SQLサーバはローカルサーバと呼ばれ、他方のサーバはリモートサーバと呼ばれます。
SYNCHRONIZEコマンドはREPLICATEコマンドを内部的に2回呼び出したものです。一回目の呼び出しでリモートサーバからのデータをローカルサーバに複製し、二回目の呼び出しでローカルサーバのデータをリモートサーバに複製します。なので同期されるテーブルは複製用に設定されていなければなりません:
詳細はREPLICATEコマンドの説明を参照してください。
SYNCHRONIZEコマンドは4つのスタンプ2つの入力スタンプと2つの出力スタンプ (最新の更新) を"引数"として受け入れます。入力スタンプはそれぞれのサーバ上での最新の同期の時期を示すために使用されます。この時期はコード化された情報として、継続時間なしで表現されます。出力スタンプは最新の更新直後のそれぞれのサーバ上での更新スタンプの値を返します。この原則により、SYNCHRONIZEコマンドが定期的に呼ばれるとき、次回の入力スタンプとして、最新の同期の出力スタンプを使用できます。
注: 入力および出力スタンプは数値として表現され、タイムスタンプとはなりません。これらのスタンプについてはREPLICATEコマンドの説明を参照してください。
エラーが発生すると、関連するサーバの出力スタンプには、エラーのもととなったレコードのスタンプが戻されます。エラーが同期以外の原因で引き起こされた場合 (例えばネットワークの問題など)、スタンプは0となります。
異なる2つのエラーコードがあります。1つはローカルサイトでの同期エラーを示すもので、もう1つはリモートサイトでの同期エラーを示します。
エラーが発生すると、データの状態はローカルサーバのトランザクションの状態に依存します。リモートサーバ上で、同期は常にトランザクション内で実行されるので、処理によりデータが変更されることはありません。しかしローカルサーバ上では、同期処理は開発者の制御下にあります。自動コミットトランザクション環境設定が選択されていない場合、トランザクションの外で処理が実行されます (選択されていればトランザクションコンテキストが自動で作成されます)。開発者はトランザクションを開始するか決定でき、データの同期後にこのトランザクションを有効にするかキャンセルするかも開発者に任されています。
REMOTE OVER LOCAL とLOCAL OVER REMOTE句を使用して、アプリケーションの特性に応じて、同期の方向を強制的に指定できます。実装メカニズムについてはREPLICATEコマンドの説明を参照してください。
注: SYNCHRONIZEコマンドで実行される処理はデータ整合性制約を考慮に入れません。これは例えば外部キー、重複不可等を管理するルールが検証されないことを意味します。受信したデータがデータ整合性を壊す可能性がある場合、複製処理終了後にデータを検証する必要があります。もっとも簡単な方法は4DまたはSQLランゲージを使用して更新されるレコードをロックすることです。
4Dは LATEST REMOTE STAMP と LATEST LOCAL STAMP 句の 4d_language_ref 変数にそれぞれ、リモートおよびローカルの最後のスタンプ値を返します。この情報を使用して同期処理を自動化できます。これらの情報は同期処理終了直後のスタンプ値に対応します。そのあとの REPLICATE や SYNCHRONIZE 文でこれらを使用する場合、値をインクリメントする必要はありません。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 | REMOTE | ||
古い値 | 新しい値 | 古い値 | 新しい値 |
AAA | BBB | AAA | CCC |
LOCAL STAMP と REMOTE STAMP に渡された値や使用される優先度オプションに基づき SYNCHRONIZE コマンドにより実行される同期は以下のようになります: ROL = REMOTE OVER LOCAL、LOR = LOCAL OVER REMOTE:
LOCAL STAMP | REMOTE STAMP | 優先度 | 同期後のローカルデータ | 同期後のリモートデータ | ローカル - リモート同期の方向 |
20 | 3000 | ROL | CCC | CCC | <----> |
20 | 3000 | LOR | BBB | BBB | <----> |
31 | 3000 | ROL | CCC | CCC | <-- |
31 | 3000 | LOR | CCC | CCC | <-- |
20 | 4001 | ROL | BBB | BBB | --> |
20 | 4001 | LOR | BBB | BBB | --> |
31 | 4001 | ROL | BBB | CCC | 同期なし |
31 | 4001 | LOR | BBB | CCC | 同期なし |
40 | 3000 | ROL | CCC | CCC | <-- |
40 | 3000 | LOR | CCC | CCC | <-- |
20 | 5000 | ROL | BBB | BBB | --> |
20 | 5000 | LOR | BBB | BBB | --> |
40 | 5000 | ROL | BBB | CCC | 同期なし |
40 | 5000 | LOR | BBB | CCC | 同期なし |
プロダクト: 4D
テーマ: SQLコマンド
SQLリファレンス ( 4D v20 R7)