0

2つのアプリケーションがあります。1つはOrderServiceで、もう1つはTradeServiceです。貿易サービスには、トランザクションである「購入」メソッドがあります。

TradeServiceがWebサービスを使用してOrderサービスのSubmitOrderメソッドを呼び出すと問題が発生します。

問題の説明:

  1. Buyメソッドのすべてのステップは1つのトランザクションの下にあります。

  2. Buyメソッドを呼び出すと、1つのOrderオブジェクトが作成されます。

  3. このメソッドがWebサービスを使用してSubmitOrderメソッドを呼び出すと、注文IDが渡されます。

  4. Submit Orderメソッドは、このIDを使用してDBからOrderObjectをロードします。

  5. ただし、Loadメソッドでは、レイジー初期化例外が発生します。セッションが閉じられます。(両方のアプリケーションが同じデータベースを共有します)

  6. これに対する考えられる解決策は、SubmitOrderメソッドをトランザクション化することです。

  7. 別のデッドロックの問題が発生します。

    • デッドロックの理由、A。Buyメソッドは「xyz」と言うIDで注文オブジェクトをロックします。同じIDを送信して注文方法を送信します。B.現在、Buyメソッドは送信注文からの応答を待っています。C.オーダー送信メソッドは、購入メソッドによってすでにロックされているため、オーダーオブジェクトをロードできません。D.したがって、SubmitOrderメソッドはロックの取得を待機しています。したがって、デッドロック状態です。

注:どちらのアプリケーションも、Spring MVC、Spring Web Service、およびHibernateを使用します。

この状況から私を助けてください。よろしくお願いします(必要に応じてコードの一部を投稿できます)

4

2 に答える 2

0

一般に、Webサービス呼び出しの両側で同じデータベーストランザクションを使用することはできません。-少なくとも、Webサービスを介して接続を転送することは不可能です。

したがって、2つのデータベーストランザクションが必要であるという事実を理解する必要があります。片側に1つずつ。-それに加えて(レイジー初期化例外が発生します)、Webサービスがエンティティを受信した場合、そのエンティティはどのセッションにも接続されないため、まだロードされていない(layzロードされた)プロパティにアクセスしようとすると次に、このlayz読み込み例外を取得します。

あなたがする必要があるのは、トランザクションを開き、最初にエンティティをこのトランザクションにアタッチすることです。

于 2011-04-15T10:03:13.340 に答える
0

TradeServiceが注文を作成するのはなぜですか?私はそれがOrderServiceの責任であると期待しています。そうすれば、同じリソースについても競合は発生しません。

はい、両方のサービスはトランザクション型である必要があります。loadメソッドがOrderインスタンスを構築するために2つの別々のデータベース呼び出しを行っており、最初のデータベース呼び出しの後にセッションが閉じられているため、LazyInitializationExceptionが発生しています。

于 2011-05-12T01:22:55.593 に答える