各作業単位が独自のトランザクションで実行されているのか、単一のグローバルトランザクションの一部として実行されているのかを確認できるようにしたいと思います。
次の形式のメソッド(springとhibernateを使用して定義)があります。
private void updateUser() {
updateSomething();
updateSomethingElse();
}
これは、ユーザーがログインしたときのWebサイトと、毎日実行されるバッチジョブの2つの場所から呼び出されます。Webサーバーのコンテキストでは、Webサーバーによって作成されたトランザクションで実行されます。バッチジョブの場合、ユーザーごとに1つのトランザクションが必要です。これにより、このメソッド中に何かが失敗した場合、トランザクションがロールバックされます。したがって、2つの方法があります。
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void updateUserCreateNewTransaction() {
updateUser();
}
@Transactional(propagation=Propagation.REQUIRED)
public void updateUserWithExistingTransaction() {
updateUser();
}
updateUserCreateNewTransaction()はバッチジョブから呼び出され、updateUserWithExistingTransaction()はWebサーバーコンテキストから呼び出されます。
これは機能します。ただし、(バッチの)この動作を変更しないことが非常に重要であるため、この動作をテストするテストを作成したいと思います。可能であれば、コードを変更せずにこれを実行したいと思います。
したがって、私が利用できるオプションのいくつかは次のとおりです。
バッチジョブの実行中にデータベースで開かれたトランザクションをカウントします。
updateSomethingElse()メソッドで、少なくとも1つのユーザー更新が失敗するようにデータを微妙に変更し、そのユーザーのupdateSomething()が実行されていないことを確認します。
コードレビュー。
1はデータベースに非常に依存する方法ですが、休止状態がトランザクションを作成しないことをどのように保証しますか?2の方が良いようですが、設定は非常に複雑です。3は、リリースごとに1つ実行する必要があるため、実際には実用的ではありません。
それで、誰かが私がこのコードを、できればシステムテストまたは統合テストを通してテストすることを可能にする方法を持っていますか?