タイムスタンプ比較の構成
タイムスタンプ比較用にレプリケーション・スキームを設定できます。
タイムスタンプ比較を構成するには、次の手順を実行します。
-
タイムスタンプ値を保持する列をレプリケート表に挿入します。「レプリケートされた表へのタイムスタンプ列の挿入」を参照してください。
-
CREATE REPLICATION
文のTABLE
要素ごとにCHECK CONFLICTS
句を含めて、タイムスタンプ列、タイムスタンプの生成方法、競合発生時の対処および競合のレポート方法を指定します。「CHECK CONFLICTS句の構成」を参照してください。
レプリケートされた表へのタイムスタンプ列の挿入
レプリケートされた表でタイムスタンプ比較を使用するには、NULL値可能なBINARY(8)
型の列を指定して、タイムスタンプ値を保持する必要があります。タイムスタンプ列は、CREATE TABLE
文の一部として表とともに作成する必要があります。
後でALTER TABLE
文の一部として追加することはできません。また、タイムスタンプ列を主キーまたは索引に含めることはできません。この例に、タイムスタンプ値を保持するBINARY(8)
型の列tstamp
を含むrep.tab
表を示します。
CREATE TABLE rep.tab (col1 NUMBER NOT NULL, col2 NUMBER NOT NULL, tstamp BINARY(8), PRIMARY KEY (col1));
レプリケート表にタイムスタンプ値が定義されていない場合は、タイムスタンプ比較を実行して競合を検出できません。かわりに、各サイトのデータベース内の行の値に、ローカル・アプリケーションまたはレプリケーションによって行に最後に適用された更新が反映されます。
CHECK CONFLICTS句の構成
レプリケーション・スキームの構成時に、CREATE REPLICATION
文の表の要素記述にCHECK CONFLICTS
句を含めることによって、TABLE
要素にタイムスタンプ比較を設定できます。
ノート:
CHECK CONFLICT
句はDATASTORE
要素には指定できません。
構文の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のCREATE REPLICATION文とCHECK CONFLICTS句を参照してください。次の例に、レプリケーション・スキームの構成時にCHECK CONFLICTS
を使用する方法を示します。
この例では、双方向レプリケーション・スキームに自動タイムスタンプ比較を設定します。west_dsn
およびeast_dsn
というDSNで、タイムスタンプ表tstamp
を含む表repl.accounts
をレプリケートするwestds
データベースおよびeastds
データベースを定義します。比較に失敗した場合は、タイムスタンプが古い方の更新を含むトランザクションを破棄します。
CREATE REPLICATION r1 ELEMENT elem_accounts_1 TABLE accounts CHECK CONFLICTS BY ROW TIMESTAMP COLUMN tstamp UPDATE BY SYSTEM ON EXCEPTION ROLLBACK WORK MASTER westds ON "westcoast" SUBSCRIBER eastds ON "eastcoast" ELEMENT elem_accounts_2 TABLE accounts CHECK CONFLICTS BY ROW TIMESTAMP COLUMN tstamp UPDATE BY SYSTEM ON EXCEPTION ROLLBACK WORK MASTER eastds ON "eastcoast" SUBSCRIBER westds ON "westcoast";
競合解消でデータベースを双方向にレプリケートした場合、各データベースのレプリケート表は、同じCHECK CONFLICTS
属性で設定されている必要があります。レプリケートされた表のCHECK CONFLICTS
設定を無効化または変更する必要がある場合は、「クラシック・レプリケーション・スキームでの競合検出の無効化」の説明に従ってALTER REPLICATION
文を使用し、レプリケートされた各データベースに適用します。
システム・タイムスタンプ列のメンテナンスの有効化
システム・タイムスタンプの比較を有効にできます。
CHECK CONFLICTS BY ROW TIMESTAMP
COLUMN ColumnName
UPDATE BY SYSTEM
TimesTenでは、基礎となるオペレーティング・システムによって返される現在の時間を使用してタイムスタンプ列の値が自動的にメンテナンスされます。これがデフォルトの設定です。
UPDATE BY SYSTEM
を指定すると、TimesTenは次の処理を実行します。
-
新しいレコードが表に挿入されると、タイムスタンプ列を現在の時間に初期設定します。
-
既存のレコードが変更されると、タイムスタンプ列を現在の時刻に更新します。
初期ロード時、タイムスタンプ列の値はNULL
のままにしておく必要があります。また、行の挿入時または更新時に、アプリケーションでタイムスタンプ列に値を指定しないでください。
ttBulkCp
またはttMigrate
ユーティリティを使用してTimesTen表を保存した場合、保存された行にそれらの現在のタイムスタンプ値が保持されます。その後、表がTimesTenにコピーまたは移行された場合は、コピー・ファイルまたは移行ファイルが作成された時点でタイムスタンプ列に含まれていた値が保持されます。
ノート:
ttBulkCp
またはttMigrate
を使用して表をコピーまたは移行した後にタイムスタンプ比較を行うようにTimesTenを構成した場合、タイムスタンプ列の初期値はNULL
のままになります。レプリケーションでは、この値が設定可能な最も早い時間とみなされます。
ユーザー・タイムスタンプ列のメンテナンスの有効化
表に対してユーザー・タイムスタンプ列のメンテナンスを有効にできます。
CHECK CONFLICTS BY ROW TIMESTAMP
COLUMN ColumnName
UPDATE BY USER
UPDATE BY USER
を構成する場合、アプリケーションでタイムスタンプ値をメンテナンスする必要があります。アプリケーションで使用されるタイムスタンプ値は任意に設定できますが、時間値は小さくできません。ユーザーがタイムスタンプ列を明示的に設定または更新した場合、アプリケーション指定の値が現在の時間のかわりに使用されます。
レプリケート対象の削除操作には、常にシステム生成タイムスタンプが含まれます。レプリケーションがUPDATE BY USER
で構成されている場合に更新/削除競合が発生すると、2つのタイムスタンプ値が比較されて競合が解消され、タイムスタンプが新しい方の操作が優先されます。ユーザー・タイムスタンプの基準がシステム生成タイムスタンプの基準と異なると、予期しない結果になる場合があります。このため、削除競合の発生が予想される場合は、システム生成タイムスタンプを使用します。