同じクラスで別の@Transactionalメソッドを呼び出す@Transactionalメソッドを持つ@Serviceクラスがあります。このためのロールバック動作をテストしていましたが、正しく機能していないことがわかりました。コードは次のようになります。
@Service
public class DefaulService implements ervice
{
@Transactional
public void methodOne()
{
methodTwo();
//question edited
//this seems to be the problem
this.serviceDAO.executeUpdateOperation();
//test rollback
throw new RuntimeException();
}
@Transactional
public void methodTwo()
{
//DAO stuff
}
}
methodOneを実行した後、データベースをチェックすると、ログに「JDBCTransaction--rollback」と表示されていても変更があります。
methodTwoを個別に呼び出し、最後に例外を追加すると、変更は正しくロールバックされます。
ネストされた@Transactional呼び出し中に発生したmethodOneのロールバック変更を適切に行う方法はありますか?REQUIREDのデフォルトの伝播でこれが達成されるという印象を受けましたが、機能していないようです。ありがとう
アップデート
わかりました、私はちょうど何か他のものに気づきました。例外スローの直前に、サービスのdaoを呼び出し、「executeUpdate」を介して手動更新を実行しています。この行にコメントすると、ネストされたロールバックが機能します。したがって、問題は実際にDAOを呼び出してexecuteUpdateクエリを実行しているようです。しかし、これも現在のトランザクション内で実行するべきではありませんか?