6

私は解決策を探していましたが、良いものを見つけることができませんでした。 は私が休止状態の挙動を評価したいと思いれる複雑なシナリオを持っている楽観ロック「私ができるスプリングスタート統合トランザクションの並列トランザクション

統合テストの良いセットになり、これを行うのに最適な場所を、ロック悲観的対が、並列トランザクションを開始するきれいな方法を見つけることができるようです。

  • どのように私は手動でスレッドを作成し、SessionFactoryのオブジェクトを注入することなく、春の統合テストに2つの並列トランザクションを作成することができます。

少なくとも2つのスレッドを生成せずに2つの並列トランザクションを作成する方法が見つからないことに注意してください(多分方法があります。

+0

あなたは、少なくとも追加のスレッドが必要になりますよう、することはできません。トランザクションとリソース管理はスレッドベースなので、2つのスレッドを持たない限り、それは難しくて複雑になるでしょう。 –

+0

スレッドを生成することなく何も方法がありません...スプリングテストはありますか?これを行うために使用するユーティリティ?または、どこかのコード例ですか? – victor

+0

__parallel__と言うと、コードに2つのスレッドが必要です。そうでなければ、悪いテストをしています。なぜ新しいスレッドを作成したくないのですか? – rascio

答えて

3

コメントに十分なスペースがないような答えとしてこれを追加する:過去に

、私は別のEntityManager /セッションを作成し、後でそれらを注入することによって、バニラ春にテストしてみました。私はあなたがSpringの統合テストからこれをどうやって行うことができるのかよくわかりませんが、それは考えを引き起こすかもしれません。

次のコードでは、アカウントはバージョン管理された小さなオブジェクトです。 Spring Integration Flow(または何かが呼び出されている場合)をカスタムエンティティマネージャでインスタンス化することができます。

public void shouldThrowOptimisticLockException() { 
     EntityManager em1 = emf().createEntityManager(); 
     EntityManager em2 = emf().createEntityManager(); 
     EntityTransaction tx1 = em1.getTransaction(); 
     tx1.begin(); 

     Account account = new Account(); 
     account.setName("Jack"); 
     account.updateAudit("Tim"); 

     em1.persist(account); 
     tx1.commit(); 


     tx1.begin(); 
     Account account1 = em1.find(Account.class, 1L); 
     account1.setName("Peter"); 

     EntityTransaction tx2 = em2.getTransaction(); 
     tx2.begin(); 
     Account account2 = em2.find(Account.class, 1L); 
     account2.setName("Clark"); 

     tx2.commit(); 
     em2.close(); 

     tx1.commit(); //exception is thrown here 
     em1.close(); 
} 
関連する問題