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. 単一サーバ上の複数のjvmsのガベージコレクションをスケジュールする
- 2. 単一の接続で複数のトランザクションを使用して
- 3. 単一トランザクションで複数の操作を実行する方法
- 4. OpenJPAトランザクション - 単一または複数のエンティティ管理者?
- 5. 単一のトランザクションのスコープ内で同じADO.NETコマンドを複数回呼び出す
- 6. 複数の行のトリガーが単一トランザクションで挿入される方法
- 7. エンティティ・フレームワーク内の単一トランザクションで複数のオブジェクトを更新する
- 8. 複数のスプリング統合チャネル間で単一のトランザクションを伝播する方法
- 9. トランザクションごとの単一接続とすべてのトランザクションの単一接続
- 10. JavaでRedis(キャッシュ)の単一の値を指す複数のキー
- 11. Jedisを使用して単一パイプラインで複数のRedisトランザクション(マルチ/ exec)
- 12. Firebaseの単一のトランザクションに複数の約束を連鎖させる方法
- 13. Howto:複数の集約の更新に単一トランザクションを使用する
- 14. 複数の単一フィールドインデックス対複数フィールドインデックス
- 15. 複数のエントリ単一セル
- 16. MongoDB複数の単一インデックス
- 17. 複数のジャー、単一パーシスタンスユニットソリューション?
- 18. wordpress複数の単一ページ
- 19. Java Swingシングルスレッド環境の単一イベントソース用の複数のイベントリスナー
- 20. 単一のサイトへの複数のGETリクエスト(標準)(java)
- 21. 単一のアクティビティで複数のWebview
- 22. Maven - 単一のPOMで複数のビルド
- 23. 単一のクエリで複数のエンティティフレームワーク
- 24. 単一のapiで複数のクエリ
- 25. 単一のソリューションで複数のMVCプロジェクト
- 26. Javaの-BlockingQueue - 複数の生産者、消費者、単一
- 27. Javaサーバー用の単一または複数のスレッドプール?
- 28. 複数のパラメータをJavaの単一パラメータとして渡す
- 29. 複数のflexクライアントを単一のJavaクラスに接続
- 30. 正規表現 - 単一のchar複数発見のJava