2

異なるシステムに2つのエンティティがあり、一方または両方に関連付けられた情報に基づいて一方または両方を変更する何らかのトランザクションを実行する必要があり、両方のエンティティへの変更が完了するか、どちらも完了しないことを要求するとします。 。

簡単な例です。基本的に、2つの別々のハードウェアで2つの行を実行する必要があります。

my_bank.my_account -= payment
their_bank.their_account += payment

おそらく、この種の状況のた​​めに特別に存在するアルゴリズムまたはイディオムがあり、同じ値への他の試みられたアクセスの存在下で正しく機能します(正しいのいくつかの予測可能な定義のために)。2フェーズコミットプロトコルは、そのようなアプローチの1つと思われます。おそらくより多くの制限がある、より単純な代替案はありますか?(たとえば、システムが完全にシャットダウンしたり、応答に失敗したりしないようにする必要があるかもしれません。)または、何らかの方法でより優れた、より複雑なシステムがあるのでしょうか。そして、その問題に関する標準的なまたは評判の良いテキストはありますか?

4

1 に答える 1

5

3PC「3フェーズコミットプロトコル」もあります。3PCは、pre-commitと呼ばれる追加のフェーズを用意することにより、2PCの問題のいくつかを解決します。トランザクションの参加者は、他のすべての参加者がコミットすることに同意したが、まだコミットしていないことを知るための事前コミットメッセージを受け取ります。このフェーズでは、すべての参加者がコーディネーターからのコミットまたはアボートメッセージのいずれかを待っているときに、2PCの不確実性を取り除きます。

AFAIK-ほとんどのデータベースは2PCプロトコルで問題なく動作します。これは、万が一失敗した場合でも、操作を元に戻したりやり直したりしてデータを一貫した状態に保つためのトランザクションログを常に持っているためです。

このようなもののほとんどは、で非常によく議論されています

「データベースソリューション、第2版」

「データベースシステム:完全な本」

分散の世界では、分散トランザクションとワークフローに関するWebサービステクノロジの現在の状態を確認することをお勧めします。正直言って、私のお茶ではありません。この種のサービスを実行するためのPython、Java、および.Netのフレームワークがあります()。

昨年のプロジェクトとして、数年前、Webサービスの上に分散2PCプロトコルを実装し、あなたが示した例のように、2つの別々のデータベースでトランザクションを実行することができました。ただし、今日、人々はこれを最も安らかなアプローチで実装していると確信しています。たとえば、ここを参照してください。これらのリンクには他のいくつかのプロトコルが記載されていますが、最終的にはすべて2PCを実装することになります。

要約すると、クラッシュが発生した場合に元に戻す/やり直すための適切な操作ログを備えた2PCプロトコルの実装は、最も賢明なオプションの1つです。

于 2011-03-22T10:44:45.057 に答える