1つのSpringサービスは、1つのJavaデプロイメントユニット(JVM)で実装されています。別のSpringサービスは別のJVMに実装されています。 1st jvmから2nd jvmへのサービスコール。サービスインターフェイスは、http経由で休むか、またはsoapすることができます。単一のトランザクションを複数のjvmsに保持する必要があります。つまり、すべてのサービスが失敗した場合、ロールバックする必要があります。これを行う方法。任意のコード例。複数のJava jvmsでの単一トランザクション
答えて
RESTは、アトミックトランザクションへに関してSOAPベースのWebサービスとまったく同じ問題に直面しています。ステートフルな接続はなく、すべての操作はただちにコミットされます。一連の操作を実行することは、他のクライアントが中間状態を見ることができることを意味する。
、場合を除き、もちろん、あなたがデザインすることで、このの世話をします。まず、自分自身に質問してください:私は原子操作の標準セットを持っていますか?これは一般的なケースです。たとえば、銀行業務では、1つのアカウントから合計を削除し、同じ合計を別のアカウントに追加することは、多くの場合、必須のアトミック操作です。しかし、REST APIは基本ビルディング・ブロックだけをエクスポートするのではなく、プロセス全体をカプセル化する単一の「転送」操作を提供する必要があります。これにより、望ましい原子性が得られます。また、クライアントコードをもっと簡単にします。このappracohは低い粒状サービス、または高レベルのバッチ操作として知られています。
所望のアトミック動作シーケンスの単純な、事前定義されたセットが存在しない場合、問題はより深刻です。一般的な解決方法は、バッチコマンドパターンです。 1つのRESTメソッドを定義してトランザクションの開始点を定義し、別のRESTメソッドを定義してトランザクションの終了点を定義します( 'コミット'要求)。これらの一連の操作の間に送信されたものは、サーバーによってキューに入れられますが、コミット要求が送信されるまでコミットされません。
このパターンは大幅にサーバーを複雑に - それは、クライアントごとの状態を維持しなければなりません。通常、最初の操作( 'begin transaction')はトランザクションID(TID)を返し、その後のすべての操作(コミットを含む)はこのTIDをパラメータとして含める必要があります。
トランザクションのタイムアウトを強制することをお勧めします。最初の「トランザクション開始」リクエストからの経過時間が長すぎる場合、または最後のステップ以降、サーバーはトランザクションを中止する権利を持ちます。これにより、DoS攻撃の可能性が排除され、あまりにも多くのトランザクションを開いたままにすることで、サーバーがリソースを浪費します。クライアントの設計は、各操作がタイムアウト応答をチェックする必要があることに留意する必要があります。
「ロールバック」APIを提供することによって、クライアントがトランザクションを中断できるようにすることもお勧めします。
この複雑な設計シナリオでは、複数の同時トランザクションを使用するコードを設計する際に通常必要な注意が適用されます。可能であれば、トランザクションの使用を制限し、代わりに高水準のバッチ処理をサポートしてください。
私はちょうどディレクターよ、この情報のないクレジットを取らない、信用はThis article
をお読みくださいあなたはここにhttp://www.it-soa.eu/en/resp/atomicrest/userguide/index.html
- いくつかの便利なコードサンプルを得ることができます
グローバルトランザクション(JTA)を使用する
XAリソース(RDBMS JMS接続)では、「2PCで完全なXA」を実行します。JTA/XAシナリオを含む春トランザクション管理に関するさらなる参照については、
、読み取り:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#transaction
- 1. 単一の接続で複数のトランザクションを使用して
- 2. OpenJPAトランザクション - 単一または複数のエンティティ管理者?
- 3. エンティティ・フレームワーク内の単一トランザクションで複数のオブジェクトを更新する
- 4. 複数の行のトリガーが単一トランザクションで挿入される方法
- 5. Jedisを使用して単一パイプラインで複数のRedisトランザクション(マルチ/ exec)
- 6. 複数の単一フィールドインデックス対複数フィールドインデックス
- 7. Howto:複数の集約の更新に単一トランザクションを使用する
- 8. 複数のジャー、単一パーシスタンスユニットソリューション?
- 9. 単一のクエリで複数のエンティティフレームワーク
- 10. Maven - 単一のPOMで複数のビルド
- 11. 単一のソリューションで複数のMVCプロジェクト
- 12. 単一のサイトへの複数のGETリクエスト(標準)(java)
- 13. Java Swingシングルスレッド環境の単一イベントソース用の複数のイベントリスナー
- 14. 複数のパラメータをJavaの単一パラメータとして渡す
- 15. 複数のflexクライアントを単一のJavaクラスに接続
- 16. Javaの-BlockingQueue - 複数の生産者、消費者、単一
- 17. Javaサーバー用の単一または複数のスレッドプール?
- 18. JPA:複数のトランザクション
- 19. Java FileWriter:クライアント/サーバー環境でのファイルのオープン/クローズ(複数インスタンス)対単一のオープン/クローズ(単一インスタンス)
- 20. 単一のmatplotlib図の複数のプロット
- 21. 単一のAzureサービスバスキューの複数のクライアント
- 22. 単一のAS3プロジェクトの複数のターゲットデバイス
- 23. 単一のリスト内の複数のクラスタイプ
- 24. 単一のタブの複数のビュー
- 25. 複数行と単一行
- 26. 複数のクエリが単一の文でjavaで実行されました
- 27. Web APIの単一コントローラ、単一サービス、複数リポジトリパターン
- 28. 単一ストリームの複数の消費
- 29. 複数のオブジェクトへの単一通知?
- 30. 複数のショッピングカートが単一のドメイン