最も最近更新されたテーブルが上書きされないように、どのようにして、Mobile Linkが、テーブルを同期するのですか?
-
06-09-2019 - |
質問
ここでのシナリオです。私は、Oracle統合データベースを持っています。私は、ハンドヘルド上で使用されているSqlAnywereデータベースでOracleを同期させるためのMobile Linkを使用しています。 ユーザAが自分の携帯デバイス「最初の更新」する上でのリモートDBのレコードを変更してから10分後にユーザーBが「第二の更新」するために彼らのハンドヘルドデバイス上で同じレコードを更新した場合、私は、統合データベースには、常に後に「第二の更新」と表示したいです2つのデバイスを同期しています。ユーザーBがユーザAの前に同期する場合は、現在の統合データベースでは、「最初の更新」読みます。
解決
今、あなたは、Mobile Linkサーバのデフォルトの競合解決を使用しています。あなたはこれを処理する独自の紛争解決スキームを実装する必要があります。
このリモート・データベースで発生する二つのことが必要になります:
1)のレコードがリモートサイトで更新された時間を追跡し、統合データベースに同期するリモート・データベースのテーブルの列があるように必要になります。
2)あなたは、リモートサイトのシステムクロックを信頼する必要があります。人々は、彼らのデータを更新し、次の週に彼らのリモートデバイス上のシステム時刻を変更するバックシステム時刻を変更することからユーザーを停止するものは何もありません、競合が彼らのデータが競合に勝ちを確認する解決とされている方法を見つけ出す必要があるとその後、同期ます。
、連結時に、あなたはそれは難しいことではありません紛争解決を実装する必要があります。限り、あなたのテーブルには、任意の塊が含まれていないとして、あなたはテーブルのためのupload_updateイベントであなたの紛争解決を書くことができます。以下のように見えるリモート・データベースのテーブルを想定してみましょう。
create table Admin (
admin_id bigint default global autoincrement(1000000) primary key,
data varchar(64) not null,
rem_last_modified timestamp not null default timestamp
);
のも非常に似ていますが、また、行は連結で変更されたときに追跡するために、別の最終更新列を持つ統合でテーブルを想定してみましょう。
create table Admin (
admin_id bigint default global autoincrement(1000000) primary key,
data varchar(64) not null ,
rem_last_modified timestamp not null default ‘1900-01-01’,
cons_last_modified timestamp default timestamp
);
一般的に、あなたのupload_updateイベントは次のようになります:
call ml_add_table_script( 'v1', 'Admin', 'upload_update',
'update Admin set data = {ml r.data},
rem_last_modified = {ml r.rem_last_modified}
where admin_id = {ml r.admin_id}'
);
その代わり、我々はストアドプロシージャを呼び出しても、リモート・データベースから古い行の値を渡すためにあなたのupload_updateイベントを再度書きます。
call ml_add_table_script( 'v1', 'Admin', 'upload_update',
'call admin_upload_update( {ml r.admin_id},
{ml r.data}, {ml r.rem_last_modified},
{ml o.data}, {ml o.rem_last_modified}’
);
あなたのストアドプロシージャへの鍵は、私たちが更新を行おうとしているが、更新のwhere句は、主キーの値と、リモート・データベースから古い行値の両方が含まれるということです。誰かがconsoliatedで行を変更した場合、この更新プログラムはゼロの行を更新します、我々は競合が発生知っています。それが行を更新した場合、競合はありませんでした。あなたのストアドプロシージャがこの(以下擬似-SQL)のようになります。
create procedure admin_upload_update (
@admin_id bigint,
@new_data varchar(64),
@new_rem_lmod timestamp,
@old_data varchar(64),
@old_rem_lmod timestamp
)
begin
declare @cur_rem_lmod timestamp;
update admin set data = @new_data, rem_last_modified = @new_rem_lmod
where admin_id = @admin_id
and data = @old_data
and rem_last_modified = @old_rem_lmod;
if @@rowcount = 0 then
// conflict !!
select rem_last_modified into @cur_rem_lmod
from admin where admin_id = @admin_id;
if @new_rem_lmod > @cur_rem_lmod then
// update using new_data and new_rem_lmod
else
// do nothing, current values in cons wins
end if;
end if;
end;
競合解決の詳細については、V10ドキュメントの次のセクションを参照
Mobile Link - サーバ管理
同期の方法
取扱競合
<のhref = "http://dcx.sybase.com/index.php#http%3A%2F%2Fdcx.sybase.com%2Fhtml%2Fdbmlen10%2Fml-conflicts-synch.html" のrel = "nofollowをnoreferrer "> http://dcx.sybase.com/index.php#http%3A%2F%2Fdcx.sybase.com%2Fhtml%2Fdbmlen10%2Fml-conflicts-synch.html の
他のヒント
あなたは、タイムスタンプベースのダウンロードまたはスナップショットのダウンロードを実装していると仮定すると、リモートの連結が前回の同期以降に別のリモートで更新された場合、連結と一致するように更新されます。
ところで、あなたが望む紛争解決の種類が利用可能であるあなたが同期モデルを設定した場合(<のhref = "http://dcx.sybase.com/index.php#http%3A%2F%2Fdcx.sybase .COM%2Fhtml%2Fdbmgen10%2Fmg-MG-約-S-5060632a.html」REL = "nofollowをnoreferrer"> http://dcx.sybase.com/index.php#http%3A%2F%2Fdcx.sybase。 COM%2Fhtml%2Fdbmgen10%2Fmg-MG-約-S-5060632a.html に)、バージョン10以上で利用できます。同期モデル作成ウィザードで、またはマッピングページのいずれかのモデルを作成した後、あなたがベースの行または列ベースの競合検出、および紛争解決の様々なタイプかどうかを選択することができます。何が欲しいのは、既存のタイムスタンプ列を選んで、「タイムスタンプ」の競合解決オプションに相当します。
FYI、ウィザードは、より多くのマッピング]ページよりオプションを説明したので、私は最初のウィザードでこれらのオプションを模索お勧めします。 「新しい勝利、あなたが維持タイムスタンプ列を使用して」オプションがグレー表示されている場合、それは同期テーブル(複数可)にはタイムスタンプ列が存在しないことを意味することに注意します。
あなたがモデルを作成したら、、あなたはイベントページで生成されたスクリプトをプレビューすることができます。あなたはモデルの設定が終了したら、SQLやバッチファイルを作成し、および/またはデータベースに直接SQLを適用するには、それを展開します。