問題タブ [2phase-commit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
distributed-transactions - XA 2フェーズコミットと準備フェーズでの実行?
2フェーズコミットを理解しようとしていますが、各ローカルサイトが分散トランザクションの一部をいつ実行するかがわかりません。
これは、準備メッセージが送信される前に発生しますか。つまり、2フェーズコミットxaプロトコルが実行される前に発生しますか?
または、各サイトは準備メッセージを受信した後に分散トランザクションの一部を実行しますか?つまり、準備メッセージ自体にも実行されるトランザクションクエリが含まれていますか?
distributed-transactions - 2 フェーズ コミットとマージの実行と準備フェーズ
私が理解している限りでは、2 フェーズ コミットが実行される前に、トランザクションを各サイトに送信するための往復通信が必要です。各サイトはトランザクションの一部を実行し、コーディネーターがすべてのサイトから応答を受け取ると、2 フェーズ コミットを実行します。これにより、準備フェーズなどが開始されます。
2 フェーズ コミットに先行する実行から準備フェーズを分離する必要があるのはなぜですか? 実行フェーズと準備フェーズをマージして、往復の通信コストを削減しない理由はありますか?
これは私の前の質問へのフォローアップです。
spring - 別のデータベースで Spring jdbctemplate を使用した 2 フェーズ コミット
次の要件があり、Spring JDBCtemplate を使用して 2 フェーズ コミットを実装する方法を知る必要があります。
- アプリケーション (JAR) はスケジュール JOB としてスタンドアロンで実行されます (Web コンテナーなし)。
- 2 つのデータベースを接続する必要があります。(データベース 1 とデータベース 2)
- データベース 1 (Oracle) を接続し (DATA を選択)、変数に格納します。
- データベース 2 (postgresql) を接続します (データベース 1 から収集した DATA をデータベース 2 に更新/挿入します)。
- データベース 2 のトランザクションが成功した場合
- データベースを 1 つに接続し、特定のテーブルの FLAG を更新します。
サンプルの作業コードを提案するか、代替の迅速なアプローチを提案してください。
よろしく、ミチル・シュクラ。
swing - EJBアプリケーション(Glassfishで実行)とSwingアプリケーションの間に2フェーズコミットプロトコルを実装します
グローバルDBと呼ぶDBにデータを保存するEJB
アプリケーションをサーバー上で実行しています。を使用してアクセスするスタンドアロンアプリケーションである2つの正確なリモートSwingアプリケーションがあります。接続が失われた場合に備えて、独自のローカルDBがあります。Glassfish
MySQL
EJB's
RMI
私の目的は、2フェーズコミットプロトコルを実装することです。つまり、1人の参加者をコーディネーターとし、他の参加者を参加者にします。
私が考えることができた1つの方法は、JMS
キューを介してメッセージを送信し、リモートクライアントにこれらのメッセージをリッスンさせて適切なアクションを実行させることを使用して実装することでした。これは、Swingアプリケーションの1つのButtonclickでメッセージを送信することで行います。問題は、私が実装したのが難しい場合でもMessageListener
、onMessage()
メソッドが他のクライアントへのメッセージを受信しないことです。
各リモートクライアントには、次のプロパティが設定されています。
これは、Glassfish
サーバーに接続connectionFactory
しQueue
て、既に構成したにアクセスするためのものです。
サーバー上で実行されているアプリケーションのみがメッセージの受信を許可され、リモートアプリケーションは許可されていないためですか?
2台のPCのトポロジーに関する提案は大歓迎です。
distributed-transactions - 3 フェーズ コミットはどのようにブロックを回避しますか?
三相コミットがブロックを回避する方法を理解しようとしています
次の 2 つの障害シナリオを検討してください。
シナリオ 1: フェーズ 2 では、コーディネーターは preCommit メッセージをすべてのコホートに送信し、コホート A を除くすべてから ack を受け取りました。ネットワークの問題により、コホート A はコーディネーターの preCommit メッセージを受信できません。コホート A は、preCommit メッセージの待機中にタイムアウトになり、中止を選択します。次に、コーディネーターとコホート A の両方がクラッシュします。
シナリオ 2: プロトコルはフェーズ 3 に達します。コーディネーターはコホート A に doCommit メッセージを送信します。しかし、さらに doCommit メッセージを送信する前に、コーディネーターがクラッシュします。コホート A は、トランザクションの一部をコミットしてからクラッシュします。
私が知る限り、残りのコホートはシナリオ 1 とシナリオ 2 の最後でまったく同じ状態になっています。したがって、回復コーディネーターが介入するとき、残りのコホートから、シナリオ 1 にいて中止するか、または中止するかをどのように確認できますか?シナリオ2にあり、コミットしてブロックを回避しますか?