あなたの質問に直接答えるのではなく、Paxos でデータベース トランザクションを実装する方法を説明しようと思います。
最初に気付くのは、ここで 2 つの「値」が問題になっていることです。1 つ目はデータベースの値で、変更されるアプリケーション レベルのデータです。2 つ目は、「コミット」/「中止」の決定です。Paxos ベースのトランザクションの場合、コンセンサス「値」は「コミット」/「中止」の決定です。
Paxos コンセンサスに関するデータベース トランザクションについて留意すべき重要な点は、Paxos は、トランザクションに関与するすべてのピアが実際にコンセンサスの決定を見ることを保証しないということです。これが必要な場合、通常はデータベースの場合と同様に、これが確実に行われるようにすることはアプリケーションに任されています。これは、一部のピアによって保存された状態が他のピアよりも遅れることがあり、Paxos の上に構築されたデータベース アプリケーションには、これを処理するための何らかのメカニズムが必要であることを意味します。これは非常に複雑になる可能性があり、すべてアプリケーション固有であるため、すべてを完全に無視し、すべてのデータベース レプリカの単純過半数がデータベース キー FOO のリビジョン 2 の値に同意することを保証することに焦点を当てます。初期設定は BAR です。
最初のステップは、FOO の新しい値を送信することです。これは BAZ であり、現在のリビジョン 1 が期待されており、Paxos Prepareメッセージと共に送信されます。データベース レプリカがこのメッセージを受信すると、最初に FOO のローカル コピーを検索し、現在のリビジョンが準備メッセージと共に含まれている予想されるリビジョンと一致するかどうかを確認します。それらが一致する場合、データベース レプリカは、 Prepareへの応答として送信されるPromiseメッセージとともに「Vote Commit」フラグをバンドルします。それらが一致しない場合は、代わりに「Vote Abort」が送信されます (リビジョン チェックは、アプリケーションが最後に値を読み取った後に値が変更された場合から保護します。
トランザクション ドライバは、関連する「Vote Commit」/「Vote Abort」値とともにPromiseメッセージのクォーラムを受信すると、「Commit」または「Abort」のいずれかを提案することを選択する必要があります。この値を選択する最初のステップは、Paxos の要件に従って、準備メッセージをチェックして、データベース レプリカント (Paxos 用語でのアクセプター) が「コミット」/「中止」の決定を既に受け入れているかどうかを確認することです。それらのいずれかがある場合、トランザクション ドライバーは、以前に受け入れられた最大の提案 ID に関連付けられた "Commit"/"Abort" 値を選択する必要があります。そうでない場合は、独自に決定する必要があります。これは、「Vote Commit」/「Vote Abort」を見ることによって行われます。秒。「Vote Commmit」の定足数が存在する場合、トランザクション ドライバは「Commit」を提案する場合があります。それ以外の場合は、「Abort」を提案する必要があります。
その時点から、「コミット」/「中止」の決定でコンセンサスに達するまで、やり取りされるのはすべて標準的な Paxos メッセージです。「コミット」が選択されていると仮定すると、データベース レプリカントは FOO に関連付けられた値とリビジョンをそれぞれ BAZ と 2 に更新します。