Spring-Javaのロールバック障害処理最近、私はプロジェクトに取り組んでいて、クラスがロールバック操作をスローしていることを誤って発見し、データが通常データベースに挿入されていることがわかったので、特定の理由を注意深く確認して調べました。
すべては、Javaのチェックされた例外と非チェックされた例外から始まります。
では、検査タイプの例外とは何ですか?非インスペクションタイプの例外とは何ですか?
最も簡単な判断点が2つあります。
1. runtimeexceptionまたはエラーから継承された非チェック例外。
2。チェックされていない例外を捕まえずにキャッチすることができますが、チェックされた例外はtry ...キャッチステートメントブロックまたは処理のための優れた方法の例外を引き渡す必要があります。要するに、それを処理するためにコードを書き込む必要があります。
Javaの例外構造を下の図に示します。その中で、例外を直接継承する例外はキャッチされ、例外をチェックする必要があります。
私のコードを振り返りましょう:
1。メソッド名の前に
@transactional
2。Spring構成ファイルApplicationContext-XXX.XMLには、Spring Thingsに関連する構成もあります。
<bean id = "transactionManager"> <プロパティ名= "dataSource" ref = "dataSource"/> <プロパティ名= "rollbackoncommitfailure" value = "true"> </property> </bean>
しかし、なぜ試してから提出されたものは、サービスレイヤーメソッドが呼び出されたときに、例外をキャッチする例外をキャッチすることが巻かれないのですか?
関連する春のドキュメントをチェックした後、元のSpring宣言トランザクション管理は、デフォルトで非チェックされた例外とランタイムの例外についてトランザクションロールバックを実行しましたが、チェックされた例外ではロールバックはありません。
Try ... CATCHでtryによってスローされる例外は、チェックタイプの例外です。 Springのフレームワークはデフォルトでロールバックされません。
プログラミングでは、チェックされていない例外を避けることができますが、チェックされた例外はTRYステートメントブロックで処理するか、それらを処理するために優れた方法に引き渡す必要があります。要するに、それらを処理するためにコードを書き込む必要があります。
したがって、例外をサービスに巻き込んでから、トランザクションが有効になるように、チェックされていない例外を手動で再度スローする必要があります。例えば:
try {………} catch(例外e){………新しいBusinessException(e.getMessage()); }もちろん、この問題を解決する簡単な方法があります。つまり、パラメーターに注釈を付けてデフォルトのロールバックメソッドを変更します。
norollbackforとrollbackforは@Transactionアノテーションで定義されており、特定の例外がロールバックされているかどうかを指定します。
例を使用してください:
@transaction(norollbackfor = runtimeexception.class)
@transaction(rollbackfor = exception.class)
したがって、上記の質問では、デフォルトのトランザクション処理方法を変更するRollback parameter @Transaction(RollBackfor = Exception.Class)を直接追加できます。
啓示:
これにより、例外をカスタマイズするときにruntimeExceptionからカスタム例外を継承する必要があります。そのため、スローするとスプリングのデフォルトのトランザクション処理によって正確に処理されます。
要約します
上記は、Javaトランザクションロールバックの失敗の問題に関するこの記事の内容全体です。私はそれが誰にでも役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!