2011-08-05 16 views
9

マルチスレッドで動作するシナリオを満たしています。マルチスレッド間で1つのトランザクションを共有する方法

メインスレッドでは、いくつかのロジックを実行してデータベースを更新し、ある時点で別のスレッドを実行してデータベースを更新する別のサービスを呼び出します。

2つのスレッドが同じトランザクションを共有するようにすると、いずれかのスレッドでどちらかの操作が失敗すると、別のスレッドでの操作もロールバックされます。

しかし、数日間働くと、JTAがマルチスレッドをサポートしていないとの記事があります。 現在BitronixをJTAプロバイダとして使用していますが、Bitronixがマルチスレッドを1つのトランザクションでサポートしているかどうかは知っていますか?または他のJTAプロバイダ(J2EEコンテナではないスタンドアロンのJTAプロバイダ)をサポートしていますか?

答えて

9

"複数のスレッドが同じグローバルトランザクションに同時に関連付けられることがあります。 - JTA仕様v1.1、セクション3.2、13ページ。

JBossTSは問題はありません。トランザクションの動作を確認しておけば、難しいのはトランザクションマネージャではありません。また、リソースマネージャ、つまりデータベースへの接続を正しく処理する必要があります。スレッド間で1つの接続を共有する場合、ドライバが効率的な多重化をサポートしていない限り、潜在的なボトルネックであるため、必ずしもシリアル接続より高速化する必要はありません。一方、複数の接続を使用する場合は、スレッドが2PCを回避するためにisSameRMを実装し、スレッドがdbに対してコミットされていない変更を参照する必要がある場合は、トランザクション分岐ロックの共有(クローズ結合)を許可する必要があります。したがって、優れたトランザクションマネージャに加えて、適切な接続マネージャが必要になります。 JCA実装と優れたデータベースドライバそれらを見つけることを幸運。

+1

Uncreditedに感謝!私はJTA仕様をチェックしました。私はその言葉を見つけました。私がBTMフォーラムで質問すると、BTMはこの機能をサポートしていないと言います。いくつかはJboss TSまたはAtomicsを示唆していますが、私はこの2つを試していません。 – Scarlett

+0

@scarlet解決策を見つけましたか? Plzはあなたの所見を共有します。 –

+1

私は今まで考えていない、私は1つのスレッドだけを使用するように変更します。あなたはどう? – Scarlett

関連する問題