2017-01-12 14 views
0

貨幣転送を実行する2つのノードがあるとします。ノードAは1つの口座から別の口座への送金を開始し、ノードBはこの取引を完了するために再請求可能である。したがって、このトランザクションを完了するために、ノードAはノードBにいくらかのTRANSFER要求を送信しなければならず、成功ノードBはTRANSFER要求の確認で応答しなければならない。私が見る可能性のある問題は、次のとおりです。TRANSFER要求ノードBがトランザクションを実行したが応答を送信できなかった場合したがって、ノードAは要求が失敗したと考えて問題を報告しますが、トランザクションは完了しました。分散トランザクションアグリゲーション

2フェーズコミットプロトコル()を検討しても、TRANSFER要求の受信時にノードBがトランザクションをコミットしないで実行し、ノードAからのコミット確認を待つ場合)同様の問題があります。ノードAがTRANSFERコミット要求を送信すると、ノードBがその要求を受信し、トランザクションが実際に完了したことを確かめることができません(この要求が宛先ホストに配信されたとしても、プロセスによってコミットされたとは確信できません)。

どのようにこの問題に取り組んでいるのですか、それとも本当に問題ですか?

答えて

0

私は、はい、それは対処する必要がある問題だと言います。転送要求が失敗した場合は、処理がノードBですでに処理されているか、処理が行われる前に(または要求がBに配信された時点より前に)障害が発生したかどうかを確認することはできません。

2PCの場合は、prepare phaseを導入することで解決されます。最初にデータ処理が行われますが、トランザクションがコミットするまで変更は外部からは見えません。準備が処理される前に障害が発生すると、トランザクション全体が中断されます。 Bがクラッシュした場合、再起動時にはトランザクションの概念はないため、接続障害のみが発生した場合はBトランザクションが最終的にタイムアウトし、中止されたため、中断されます。準備が処理された後に障害が発生した場合、すべての作業はコミットのために行われます。 Bとの通信が失敗した場合、(定期的に)Bに連絡して最後に取引を終了することは、トランザクションマネージャーの責任です。