2

同時使用のためにトランザクションのサービス メソッドをテストするにはどうすればよいですか (値を減らすことでデータベースの行を更新します)。

SpringJunit4ClassRunner を使用して JUnit テスト クラスをセットアップしました。コンポーネントは @autowired です。

メソッドを呼び出すスレッドを生成するだけでは機能しないようです。これが Spring プロキシ メカニズムと関係があるかどうかはわかりません。

私が達成したいのは、同時に 2 つのスレッドがテストされたメソッドの「内部」にあり、他のスレッドが失敗してロールバックする状況を作成することです。たとえば、行の値が 3 で、両方のメソッド呼び出しが値を 2 減らそうとします。メソッドが機能しない場合、値は -1 になりますが、これは違法です。しかし、両方の呼び出しが失敗してロールバックするか、それを更新しようとする呼び出しが他の呼び出しよりも少し遅れて失敗することを望みます。

これは可能ですか?

4

1 に答える 1

4

最初の問題は、トランザクション コンテキストが(スレッド ローカルで) 1 つのスレッドにバインドされていることです。したがって、各スレッドでトランザクションを開始する必要があります。(春にはこれのサポートはないと思います。トランザクションマネージャーを使用してプログラムでトランザクションを開始できます。)

あなたが説明したコード:読み取り、デクリメント、書き込みは、適切な分離レベルでのみ機能します(シリアル化された反復可能な読み取りが機能します)。

このセットアップが完了したら、データベースをロックしている間、1 つのスレッドをブロックして動作をテストできます。これにはラッチを使用できます。

データベース ロックのないスレッドは、まだロールバックされません。データベース ロックが再び使用可能になるまでブロックされます。あなたが説明しているスキームは楽観的同時実行制御に非常に似ているため、これはすでに実装されている可能性があります。

于 2009-11-11T13:57:35.727 に答える