1

2 フェーズ コミットでは、トランザクションに参加するすべてのコンポーネントが「はい」と投票した後、トランザクション コーディネータが「コミット」コマンドを発行します。そして、各参加者は自分のトランザクションをコミットします。

参加者のいずれかが「コミット」ステップで失敗した場合はどうなりますか? このコンポーネントは失敗しましたが、他のコンポーネントがすでにトランザクションをコミットしている可能性があります。これが発生した場合、トランザクションコーディネーターはすべての参加者にロールバックコマンドを発行できますか?

ありがとう。

4

1 に答える 1

3

最初のフェーズの全体的な目的は、コミット フェーズ中に何も失敗しないようにすることです。少なくとも、データの整合性またはビジネス プロセスの観点から。そのため、コミットの準備フェーズが正常である場合、ネットワーク/通信障害を除いて、コミットが機能すると想定できます。

すべての参加システムは、状況を処理するいずれかの方法について合意する必要があります。

1.自動コミット。ロールバックがコーディネーターによって明示的に呼び出されない場合 (所定の時間内に)、トランザクションはそれぞれの参加システムによってコミットされたものとして扱われます。

2.Transaction Coordinator は、失敗したコンポーネントごとに再試行します。ネットワークに障害が発生した場合でも、再試行が機能する場合があります。

3.補償。指定された回数の再試行の後、トランザクション コーディネーターは、トランザクションが一貫性のない状態で終了したと見なします。その後、補償を試みることができます。(注: これは必ずしもロールバックではありません。これは、トランザクションが失敗したときに実行されるアクションのようなものです)。

これについて考えてみましょう。補正自体は、すべてのリソース マネージャーで成功するとは限りません。

一部のビジネス プロセスでは、手動による補正も必要になる場合があります。そのため、システムを元の状態に戻すには、ログを記録し、アラートを発生させ、手動で補正する必要がある場合があります。

于 2012-12-03T16:51:25.427 に答える