17.8. 非アトミックトランザクションとヒューリスティックな結果

アトミック性を保証するために、2 相コミットプロトコルは ブロッキングしています。障害回復のメカニズムが存在していても、障害の結果として、パーティシパントは不定期間ブロックされた状態でいることができます。アプリケーションとパーティシパントの中にはこのブロッキングを許容できないものもあります。
このブロックする性質を打破するためには、prepare フェーズを過ぎたパーティシパントはコミットまたはロールバックするか自発的に決定できます。そうしたパーティシパントが最終的に当初のトランザクションを完了する要求を行う場合にそうできるようにするため、決定を記録する必要があります。コーディネータは最終的にはトランザクションの結果をパーティシパントに通知します。結果がパーティシパントが決定したものと同じであれば、競合は存在しません。パーティシパントとコーディネータの決定が異なる場合は、その状況は非アトミックな結果、さらに具体的に言うと ヒューリスティックな結果 と呼ばれます。
ヒューリスティックな結果の解決およびアプリケーションへの報告は、通常複雑な手動式システム管理ツールが行う領域です。自動解決の試行には、トランザクションに関わるパーティシパントの性質の意味情報が必要なためです。
パーティシパントがヒューリスティックな決定を行う正確な時は固有の実装によります。同様に、パーティシパントがコミットまたはロールバックするかの決定は実装によって決まり、またアプリケーションやパーティシパント自身がある環境による可能性があります。起こりうるヒューリスティックな結果については 表17.2「ヒューリスティックな結果」 で説明します。

表17.2 ヒューリスティックな結果

結果
詳細
Heuristic Rollback
パーティシパントの一部またはすべてがトランザクションを一方的にロールバックしたため、コミット動作は失敗しました。
Heuristic Commit
すべてのパーティシパントが一方的にコミットしたため試行したロールバック動作は失敗しました。これが発生する可能性がある状況としては、コーディネータがトランザクションの prepare に成功したが、そのトランザクションのログが更新できなかったためトランザクションをロールバックしようと決定する場合です。コーディネータが決定を行う一方で、パーティシパントはコミットするよう決定します。
Heuristic Mixed
一部のパーティシパントはコミットし、他のパーティシパントはロールバックされました。
Heuristic Hazard
一部の更新のディスポジションは既知ではありません。更新が既知の場合は、すべてコミットされるか、すべてロールバックされます。
ヒューリスティックな決定は、例外的な状況でのみ注意して使用されるべきです。トランザクションサービスによる決定とは異なる可能性があるためです。このタイプの違いは、システム内の整合性を失う恐れがあります。ヒューリスティックを発生させないサービスやパーティシパントと連携したり、解決プロセスで役立つトランザクションサービスを使用することにより、ヒューリスティックな解決を行う必要性をなくすようにしてください。