7

同じクラスで別の@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クエリを実行しているようです。しかし、これも現在のトランザクション内で実行するべきではありませんか?

4

1 に答える 1

1

メソッドを呼び出すときに、Bean ファクトリから「サービス」のインスタンスを確実に取得していますよね?Bean ファクトリは、各メソッド呼び出しに関するトランザクション ロジックを実装するプロキシを設定する必要があります。これは、「部外者」がプロキシ経由でメソッドを呼び出す場合にのみ機能し、あるメソッドが別のメソッドを呼び出す場合には必ずしも機能しないという印象を受けました。そのメソッドは実装オブジェクト内での直接呼び出しであり、AOP プロキシを経由しないからです。

于 2011-11-09T21:00:54.907 に答える