タイムスタンプを使用した競合の解決

競合が発生する可能性があるレプリケート表の場合は、BINARY(8)型の特別な列を持つ表を作成して、行を挿入または最後に更新した時刻を示すタイムスタンプ値を保持します。

特定の行が変更されるたびにこの列にタイムスタンプ値が自動的に挿入されるようにTimesTenを構成できます(「タイムスタンプ比較の設定」を参照)。

ノート:

TimesTenでは、キャッシュ・グループにキャッシュされた表とOracle Database間の競合解消はサポートしていません。

レプリケーションでのタイムスタンプ列の計算方法は、システムによって異なります。UNIXまたはLinuxシステムでは、gettimeofdayシステム・コールによって返されるtimeval構造体からタイムスタンプ値が導出されます。この構造体は、粒度が1マイクロ秒の時刻を4バイトの単語の組合せでレポートします。実際の粒度はシステムによって異なります。

TimesTenでは、トランザクションが各レコードを適用するときにシステムによって返される時間値が、レコードの挿入または更新時間として使用されます。そのため、単一のトランザクションによって挿入または更新された行が、異なるタイムスタンプ値を受信する場合があります。

マスターから受信したトランザクションを適用する場合、サブスクライバ・データベースのレプリケーション・エージェントは、挿入処理、更新処理、削除処理について次の方法でタイムスタンプによる解消を実行します。

  • レプリケートされたINSERT処理を適用する場合:

    • 適用されるトランザクションのタイムスタンプが既存の行のタイムスタンプよりも新しい場合、既存行が上書きされます。

    • トランザクション・レコードと保存されているレコードのタイムスタンプが同じである場合、挿入処理は破棄されます。

    • トランザクション・レコードのタイムスタンプが保存されているレコードのタイムスタンプよりも古い場合、トランザクションの挿入処理は破棄されます。

    • 保存されている行が削除されていた場合、比較に使用できるタイムスタンプがありません。以前に削除された行へのレプリケートされた挿入処理が、挿入として適用されます。

  • レプリケートされたUPDATE処理を適用する場合:

    • 適用されるトランザクション・レコードのタイムスタンプが保存されているレコードのタイムスタンプよりも新しい場合、TimesTenは行に対して更新処理を適用します。

    • トランザクション・レコードと保存されているレコードのタイムスタンプが同じである場合、更新処理は破棄されます。

    • トランザクション・レコードのタイムスタンプが保存されているレコードのタイムスタンプよりも古い場合、トランザクションの更新処理は破棄されます。

    • 保存されている行が削除されていた場合、比較に使用できるタイムスタンプがありません。削除された行に対して指定された、レプリケートされたすべての更新処理は破棄されます。

    • 更新された行を検出できない更新処理は削除競合とみなされ、レポートされますが、解消はできません。

  • レプリケートされたDELETE処理を適用する場合:

    • レプリケートされた削除処理のタイムスタンプが既存行のタイムスタンプよりも新しい場合、既存行は削除されます。

    • レプリケートされた削除処理のタイムスタンプが保存されたレコードよりも古い場合(行が最近変更された場合)、削除処理は拒否されます。

    ノート:

    表にON EXCEPTION NO ACTION句が指定されている場合、タイムスタンプ比較に失敗した更新、挿入、削除処理は拒否されます。このため、レプリケーションでトランザクションの処理の(すべてではなく)一部が適用された場合、トランザクションの一貫性が損なわれる可能性があります。表にON EXCEPTION ROLLBACK WORK句が指定されている場合(デフォルト)は、タイムスタンプ比較に失敗すると、更新のトランザクション全体が拒否されます。

ローカル更新のタイムスタンプ比較

レプリケーション・サイト間で表の同期をメンテナンスするには、TimesTenでローカル・トランザクションが実行する更新に対してもタイムスタンプ比較を行います。更新された表に自動タイムスタンプ・メンテナンスが宣言されている場合、現在のシステム時間を超えるタイムスタンプを持つレコードへの更新は禁止されます。

通常、レプリケート・システムのクロックは、他のシステムに保存されているレコードのタイムスタンプより後のタイムスタンプがローカルで更新された同じレコードに指定されるように十分に同期されています。完全に同期させることは不可能ですが、レプリケーションでは、レコードのタイムスタンプが過去にさかのぼらないようにすることによって、レプリケート・システムの表を同期されたままにできます。