ttXlaApplyからのリターン・コードは、更新が正常に行われたかどうかを示します。リターン・コードが!= SQL_SUCCESSの場合は、更新で一時的な問題(デッドロックまたはタイムアウト)あるいは永続的な問題が発生した可能性があります。この場合、ttXlaErrorを使用すると、tt_ErrDeadlockVictim
、tt_ErrTimeoutVictim
などのエラーを確認できます。一時的なエラーは、レプリケートしたトランザクションをロールバックし、再実行することでリカバリできます。その他のエラーは、重複キー違反、キーが見つからないなどの永続的エラーである可能性があります。このようなエラーは、トランザクションを再実行しても、繰り返し発生する可能性があります。
ttXlaApply が、トランザクションのコミット・レコード(ttXlaUpdateDesc_t→ flags = TT_UPDCOMMIT)をサブスクライバ・データ・ストアに適用する前にタイムアウトまたはデッドロックのエラーを返した場合は、ttXlaRollback関数を使用してトランザクションをロールバックするか、またはttXlaCommit関数を使用してサブスクライバ・データ・ストアにすでに適用済のレコードの変更をコミットします。
一時的なエラーからのリカバリを有効にするには、マスター・データ・ストアのトランザクション境界を追跡し、サブスクライバに現在適用中のトランザクションに関連付けられているレコードをユーザー・バッファに保存します。これによって、必要に応じてそれらのレコードを再適用できます。トランザクション境界は、レコード・データ・ストリーム内のコミット・レコード(ttXlaUpdateDesc_t→ type = COMMITONLY)を検索することによって検出できます。トランザクションをロールバックする必要があるエラーが発生した場合は、ttXlaRollbackをコールして、サブスクライバ・データ・ストアにすでに適用済のレコードをロールバックした後、ttXlaApply をコールして、バッファに保存されているすべてのロールバック・レコードを再適用します。
注意: | 非永続モードでXLAを処理する場合は、トランザクション・レコードをユーザー・バッファに保存するかわりに、ttXlaGetLSNをコールして、トランザクション・ログ内の各コミット・レコードのログ順序番号を取得します(「ブックマークの位置の変更」を参照)。トランザクションをロールバックする必要があるエラーが発生した場合は、ttXlaSetLSNをコールして、ブックマークをトランザクション・ログ内のトランザクションの先頭に再設定し、レコードを再適用します。ただし、この方法は、ttXlaGetLSN関数関連の追加のオーバーヘッドが発生するため、効率が悪くなる場合があります。 |