トランザクションが複数のスレッドを生成する場合、Spring でグローバル トランザクションを模倣する方法はありますか。Spring では実際には不可能であることはわかっていますが、おそらくいくつかの回避策があると考えていました。
2 に答える
通常、トランザクションおよびその他のコンテキストはコンテナーによって ThreadLocal に保持され、スレッドの実行中にすべてのメソッドで使用できます。WorkManager API を使用する場合は、ベンダーが非同期ジョブへのトランザクション コンテキストの伝播をサポートしているかどうかを確認する必要があります (私が思い出した仕様では必須ではありません)。
別の方法として、Spring のカスタム Bean スコープを調べることもできます。操作にカスタム スコープを実装し、そこにトランザクション コンテキストを格納してみてください。しかし、それは些細なことではないかもしれません。
より一般的な注意点として、非同期スレッドへのトランザクション スコープの伝播が必要になるのは正しくないように思えます。通常、非同期操作は CPU を集中的に使用するか、寿命が長いため、トランザクションを必要とせずに再実装する方がよい可能性があります。
Spring はトランザクション サポートを提供しません。既存のメカニズム (JTA、ローカル トランザクション、モック トランザクション) に結びついているだけです。したがって、使用している基になるトランザクションに翻弄されます。
アプリケーションサーバーを使用している場合、それらのいくつかはコンテナー内で並列処理を実行できます。コンテナー管理のスレッド プールには、コンテナー リソース (JNDI コンテキスト、トランザクションなど) を他のスレッドに伝達できるという利点があります。
たとえば、WebSphere と WebLogic は WorkManager API を使用します: http://www.devx.com/Java/Article/28815/0 ただし、Java EE 6 がスレッド プールをサポートするようになったことを思い出すようです (これについてはよくわかりませんが、けれど)。