4

Java over REST で分散サービスのトランザクションを実装しようとしています。いくつか質問があります。

  1. リソースが肯定的に応答し、フェーズ 2 でコミットに失敗するとどうなりますか?
  2. 検索してみましたが、残念ながら、2PC プロトコルでロールバックが失敗した場合に何が起こるかについて、適切な答えが見つかりませんでした。ブロッキング プロトコルであり、応答を無限に待機することはわかっていますが、実際のシナリオではどうなりますか?
  3. 分散トランザクション管理のための他のプロトコルは何ですか?
  4. トランザクション実装の JTA について読みましたが、トランザクションの実装に使用できる他の実装はありますか? どんな返信でも役に立ちます。前もって感謝します。
4

1 に答える 1

1

これらの質問に対する答えはありませんが、特定のケースに固有の方法を作成しました。したがって、同じケースでトランザクションが必要な場合は、ここに投稿してください。

私の場合、データベース(またはサービスとしても実行されているインデクサー)の現在のエントリに変更はありませんが、システムのさまざまな場所に新しいエントリしかなかったため、誤った失敗は有害ではありませんでしたが、誤った成功はありました. したがって、私の特定のケースでは、次の戦略に従いました。

私。すべてのリソースは、データベースの行にトランザクション ID を追加します。コーディネーターがリソースに要求する最初のフェーズでは、すべてのリソースが、コーディネーターによって生成されたトランザクション ID を使用してデータベースにエントリを作成します。

ii. フェーズ 1 の後、リソースがデータベースに変更を加えたことを意味する肯定的な応答がすべてのリソースから返されると、コーディネーターは自身のログにトランザクションが成功したというエントリを作成し、それをリソースに伝えます。すべてのリソースは、挿入されたデータの行でトランザクション ステータスを成功にします。

iii. データベースを検索し、コーディネーターにステータスを問い合わせてトランザクションのステータスを修正するサービスが継続的に実行されます。エントリまたは失敗エントリがない場合、トランザクションは失敗ステータスを返し、サービスで同じステータスが更新されます。データをフェッチするとき、データベースに失敗ラベルを持つエントリがあれば、常にコーディネーターでトランザクション ステータスをチェックし、失敗のエントリがない場合は結果をフィルタリングします。したがって、情報がない、または障害情報があるデータ エントリは提供されません。したがって、結果は常に一貫しています。

この戦略は、私の場合の原子性への道を提供します。

于 2012-07-09T10:25:43.443 に答える