Spring @Transactionは、スローされた例外でロールバックしません
質問
この質問を検索しました。StackOverflowとGoogleにはかなりの数の質問がありますが、何も機能していないようです。
これが私のコードです Spring config :(ポイントカットは使用しません-使用する必要はないと思いますか?) ジェネラコディセタグプレ
サービスクラスがあります: ジェネラコディセタグプレ
およびDaoクラス: ジェネラコディセタグプレ
いくつかの不要な詳細が削除されます(たとえば、セッターの欠落など)。コードが完全に正常に機能すると想定します。
上記の問題は、ランダムスロー例外行を追加したときにロールバックせず、DAOを介して永続化されているオブジェクトがデータベースに残ることです。
Spring3.1とHibernate3.6を使用しています(Spring3.1のHibernate4.0にバグがあったため)
考え?
ありがとうございます
解決 2
問題の原因と、トランザクションが(一見)適切に管理されなかった理由を見つけました。
コードのどこか ジェネラコディセタグプレ
「-ここにいくつかのロジック-」と書かれている部分には、生のSQLを使用し、更新の実行を呼び出すロジックが実行されています。 ジェネラコディセタグプレ
また、Hibernateクエリを使用せず、代わりに生のSQL実行を使用しているため、フラッシュが呼び出され、呼び出し前に行われたすべての作業が それ。
トランザクションが適切に管理されるように、このロジックを考慮してロジックのフローを作り直しました。生のSQLを使用している場合は、何か問題があることを示している可能性があります。サービスが実行しようとしていることや、サービスのパフォーマンスを向上させるために、何かを行う必要がありました。
他のヒント
これは、トランザクション管理の意図された動作です。 @Transactionalのデフォルトの動作は、実行時例外に対してのみロールバックすることです。 DaoExceptionをスローした後にコンテンツをロールバックする場合は、ロールバック例外リストに追加します。RuntimeExceptionも含めることを忘れないでください。 Daoクラスで次のことを試してください @Transactional(propagation= Propagation.Mandatory、rollbackFor= {RuntimeException.class、DaoException.class})
DaoImplクラスから@Transactionalアノテーションを削除してみてください。トランザクションの境界(DaoImpl)を超えたときに、トランザクションがコミットされている可能性があります。私はこの設定でさまざまな成功を収めてきました。「内部」トランザクションに対して、いくつかの異なるトランザクションアプローチを試すことができます。
他にできることは、Springトランザクションログをオンにすることです。そのカテゴリはorg.springframework.transactionか何かだと思います。そうすれば、トランザクションをロールバックしてコミットするためにw.r.tが何をしているのかを正確に確認できます...
デフォルトでAUTOCOMMITモードになっているJDBCドライバーの1つがありませんか?