4

私の目的は、単体テストを使用して、アプリケーションで楽観的ロック例外を引き起こすことです。私はすでに理論的にこれを行う方法を理解しています。しかし、実際の問題は、2 つのスレッド間のトランザクションをどのように維持するかということです。

だから、これは私がこれまでにやったことです:

私はJUnitテストを使用しています:

@RunWith(SpringJUnit4ClassRunner.class)

EntityManager org.springframework.orm.jpa.JpaTransactionManager の使用

各メソッドが定義されている場所@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)

でトランザクションを開始し、entityManager.getTransaction().begin();で終了しますentityManager.getTransaction().rollback());

これは、シングルスレッドテストで保存、更新などに最適です。

複数のスレッドを作成するには、Springs TaskExecutor を使用します (ここで説明されている内容に似ています: TaskExecutor の例を使用した良い Spring スレッドはありますか? ) 。

しかし、2 つのスレッド間のトランザクションを維持するにはどうすればよいでしょうか? @Transactional で run() メソッドに注釈を付けるようなことを試しましたが、これは機能しません。

4

1 に答える 1

6

頭に浮かぶいくつかの質問 -

グローバル トランザクション
すべてのスレッドを同じトランザクションの一部にする必要がありますか? つまり、スレッドが例外をスローした場合、他のスレッドの変更をロールバックしますか?

ローカル トランザクション 各スレッドは、他のスレッドに影響を与えずに独自のトランザクション境界を持つ必要がありますか? この場合、1 つのスレッドの例外とロールバックは、他のスレッドには影響しません。

グローバル トランザクションを実現するには、ほとんどの場合、適切なリソース ドライバーを備えた JTA トランザクション マネージャーを使用する必要があります。Spring には、グローバル トランザクションのデフォルト サポートがありません。アプリケーションが Java EE アプリケーション サーバー (Jboss、Weblogic) で実行されている場合、デフォルトで JTA サポートが得られ、Spring を構成してアプリケーション サーバーのトランザクション管理機能を使用できます。Tomcat で実行している場合は、次のようなオープン ソース JTA 実装をプラグインできます。

アトミコス

Jboss トランザクション

ローカル トランザクション (つまり、独自のトランザクション境界を持つ各スレッド) を実現するには、Spring トランザクション アノテーションを使用する以外に何もする必要はないと思います。次の例では、'service' が Spring Bean であり、doSomething() が適切に注釈付けされていることを確認してください。

taskExecutor.execute( new Runnable() {
           public void run() {
                service.doSomething( );
           }
      });
于 2012-10-26T14:17:59.433 に答える