タイムスタンプ比較の構成

タイムスタンプ比較用にレプリケーション・スキームを設定できます。

タイムスタンプ比較を構成するには、次の手順を実行します。

レプリケートされた表へのタイムスタンプ列の挿入

レプリケートされた表でタイムスタンプ比較を使用するには、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つのタイムスタンプ値が比較されて競合が解消され、タイムスタンプが新しい方の操作が優先されます。ユーザー・タイムスタンプの基準がシステム生成タイムスタンプの基準と異なると、予期しない結果になる場合があります。このため、削除競合の発生が予想される場合は、システム生成タイムスタンプを使用します。