2011-01-31 12 views
0

私は春のRESTコントローラ&を使用していますが、両方のRESTクライアントがコントローラを呼び出して処理される値を取得する状況がありますが、どちらも同じ値を処理しています彼らは同時に両方のコントローラを呼び出します。私はプロバイダとして休止状態でJPAを使用しています。コントローラからの初心者の取引トランザクションの質問

コールを別々のトランザクションにスコープする必要があることは知っていますが(@Transactionalアノテーションをコントローラメソッドに置いていますが)、同じ値を取得していることがわかります。

デバイス1 - タイムスタンプ0:イベントキューからすべての "保留" イベントを読み込み

コントローラーA:「処理するアップデート "保留" イベント

コントローラーAのコントローラへの呼び出し"イベント

デバイス2 - タイムスタンプ0:コントローラへのコール

コントローラーB:アップデート「保留」イベントに「処理済み」イベント

コントローラーBはコントローラーAが選ばれた値はいけない:はイベントキューからすべての「保留」イベント

コントローラーBを読み込み&処理済み...

だから、私が探していると思うものは、トランザクション間で「読み取りロック」です。

私は拡張性に興味があるので、スケーラビリティを(つまりは唯一可能な限り短くするためにDBトランザクションを保持したい)を助ける最善のアプローチを採用したい... おかげで、

答えて

0

コントローラーBとコントローラA 「同時に」開始され、キューから同じイベントが表示されます。コントローラの1つがトランザクションをコミットした後にのみ、キューが変更されます。

このような短い問題の記述から「最良のアプローチ」を記述することは困難です。たとえば、トランザクション・メッセージング(JMS)を使用したり、新しいトランザクションで「次の保留中のイベントを取得してロックされたものとしてマークする」など、いくつかの方法があります(ただし、イベントの処理は失敗します)。

+0

ありがとうございます - これは完全な再設計となるので、私はJMSルートを下りたいと思っています.... – Ian

0

他のコントローラにイベントが既に処理されていることを伝える「何らかの仕組み」を採用する必要があります。つまり、処理されるまでイベントをロックするメカニズムを持つことを意味します。以前に提案されたようなものは、「次の保留中のイベントを取得し、ロックされたものとしてマークする」のようなものです。トランザクションが適切なステータスでコミット/ロールバックされた場合は、ロックを解除します。

希望に役立ちます。