レプリケーション競合が発生する理由
双方向レプリケーション・スキームで構成されたデータベースの表では、レプリケーション競合が発生する可能性があります。レプリケーション競合は、双方向レプリケーション・データベースでアプリケーションが同じデータ項目に対して同時に更新、挿入または削除処理を開始した場合に発生します。
特別なステップを実行しなかった場合、各データベースが他方のデータベースで最後に行われた更新と一致しなくなる可能性があります。
次のタイプのレプリケーション競合が発生する可能性があります。
-
更新競合: このタイプの競合は、異なるデータベースで同時実行中のトランザクションが同じ表の同じ行に対して同時に更新リクエストを行い、1つ以上の列に異なる値をインストールした場合に発生します。
-
一意競合: このタイプの競合は、異なるデータベースで同時実行中のトランザクションが、主キーまたは一意キーは同じでも、他の1つ以上の列の値が異なる同じ表の行に対して同時に挿入リクエストを行った場合に発生します。
-
削除競合: このタイプの競合は、あるデータベースのトランザクションが行を削除し、別のデータベースの同時実行トランザクションが同時に同じ行を更新または挿入した場合に発生します。現在、TimesTenでは削除/更新競合は検出できますが、削除/挿入競合は検出できません。TimesTenはいずれのタイプの削除競合も解消できません。
更新競合、一意競合および削除競合の検出時にTimesTenで生成されるレポートの例は、「競合のレポート」を参照してください。
ノート:
TimesTenでは、TRUNCATE TABLE
文に関連する競合は検出されません。
更新競合および挿入競合
更新競合および挿入競合は、いくつかの状況で発生する可能性があります。
図12-1に、次の状況で値X
に対して発生する更新競合の結果を示します。
ステップ | データベースA | データベースB |
---|---|---|
初期状態 |
Xは1です。 |
Xは1です。 |
各データベースのアプリケーションが同時にXを更新。 |
X=2を設定します。 |
X=100を設定します。 |
各データベースのレプリケーション・エージェントが他方のデータベースに更新を送信。 |
XをデータベースBにレプリケートします。 |
XをデータベースAにレプリケートします。 |
各データベースが他方のデータベースの更新を受信。 |
レプリケーションがX=100に設定するように指示します。 |
レプリケーションがX=2に設定するように指示します。 |
ノート:
挿入の競合から発生する一意競合は、更新競合に類似したパターンになります。ただし、競合は行全体に影響します。
更新競合または挿入競合を確認しないでそのままにしておくと、マスターとサブスクライバのデータベースは互いに同期しなくなります。正しいデータベースを判断することが困難、または不可能になる場合さえあります。
更新競合では、トランザクションで多数のデータ項目が更新された場合でも、一部の項目で競合が発生する可能性があります。トランザクションの結果は、レプリケーションによって少し上書きされるのみで、ほとんどが競合の影響を受けません。このような競合を無視すると、アプリケーション・データのトランザクションの一貫性が損なわれます。
更新競合が発生した場合、および行のバージョンごとに更新された列が異なる場合は、行に対する主キー以外のフィールドがレプリケート表間で異なる場合があります。
ノート:
1つのデータベース内では、ロック・プロトコルで更新競合が防止されるため、一度に1つのトランザクションのみがデータベースの特定の行を更新できます。ただし、レプリケーション・システムでは、各データベースで独立して処理を行うことができるため、更新競合が発生する可能性があります。
TimesTen Classicレプリケーションでは、同時更新または同時挿入に対処するためにタイムスタンプ・ベースの競合解消が使用されます。タイムスタンプ・ベースの競合解消を使用することで、レプリケート・データベースの同期およびトランザクションの一貫性を維持できます。
削除/更新競合
図12-2に、次の表に示す状況でRow 4に対して発生する削除/更新競合の結果を示します。
ステップ | データベースA | データベースB |
---|---|---|
初期状態。 |
Row 4が存在します。 |
Row 4が存在します。 |
各アプリケーションで、Row 4に対して競合する更新および削除を同時に発行。 |
Row 4を更新します。 |
Row 4を削除します。 |
各データベースのレプリケーション・エージェントが他方のデータベースに削除または更新を送信。 |
更新をデータベースBにレプリケートします。 |
削除をデータベースAにレプリケートします。 |
各データベースが他方のデータベースから削除または更新を受信。 |
レプリケーションがRow 4を削除するように指示します。 |
レプリケーションがRow 4を更新するように指示します。 |
TimesTenは削除/更新競合を検出およびレポートすることはできますが、解消することはできません。このような状況では、マスターとサブスクライバのデータベースは互いに同期しなくなります。
TimesTenでは、このような競合が発生した後のデータベース間の同期は保証できませんが、最新のトランザクションが各データベースに適用されることは保証されます。削除のタイムスタンプが更新のタイムスタンプより新しい場合は、各データベースで行が削除されます。更新のタイムスタンプが削除のタイムスタンプより新しい場合は、ローカル・データベースで行が更新されます。ただし、その行は他方のデータベースでは削除されているため、レプリケート対象の更新は破棄されます。「削除/更新競合のレポート」を参照してください。
ノート:
UPDATE BY USER
が使用されている表でタイムスタンプの比較が有効になっている場合は、この動作の例外となります。「ユーザー・タイムスタンプ列のメンテナンスの有効化」を参照してください。