最近、トランザクションがロールバックされない状況に遭遇しました。また、JPAのトランザクションにバグがあると言っていましたか?考えすぎています...
ログを明確に印刷するために、Tyrcatchを追加してキャッチ内のログを印刷します。しかし、ここの状況が来ます。この方法が異常な場合、ログは印刷されますが、追加のトランザクションはロールバックされません。
例:
このような方法はロールバックされません(1つのメソッドエラー、もう1つの方法はロールバックされません):
if(usersave){try {userdao.save(user); usercapabilityquotadao.save(capabilityquota); } catch(Exception e){logger.info( "インターフェイスを開く機能、アカウントの開く例外、例外情報:"+e); }}次のメソッドがロールバックします(1つのメソッドエラー、もう1つの方法はロールバックされます):
if(usersave){try {userdao.save(user); usercapabilityquotadao.save(capabilityquota); } catch(Exception e){logger.info( "インターフェイスを開く機能、アカウントの開く例外、例外情報:"+e);新しいruntimeexception()を投げる; }}または:
if(usersave){try {userdao.save(user); usercapabilityquotadao.save(capabilityquota); } catch(Exception e){logger.info( "インターフェイスを開く機能、アカウントの開く例外、例外情報:"+e); transactionAspectSupport.CurrentTransactionStatus()。setRollBackonly(); }}なぜあなたは出られないのですか? ?春のトランザクションメカニズムを理解していません。 ! !
*****デフォルトのスプリングトランザクションは、猛攻撃のruntimeexcetpionが発生した場合にのみロールバックされます。 *******
Springaop例外キャプチャの原則:傍受された方法は、例外を明示的にスローする必要があり、いかなる方法でも処理することはできません。このようにして、AOPエージェントはメソッドの例外をキャッチしてロールバックできます。デフォルトでは、AOPはRuntimeExceptionの例外のみをキャッチしますが、合格することができます。
特定の例外をキャッチするように構成し、ロールバックします
言い換えれば、サービスメソッドでtrycatchを使用したり、Thrownewruntimeexcetpion()をキャッチに追加したりしないでください。プログラムが並外れているときにプログラムをキャッチして巻き戻すことができます。
解決:
ソリューション1。たとえば、サービスレイヤーがトランザクションを処理する場合、サービスのメソッドは例外キャプチャを実行したり、CATCHステートメントにThrownewRuntimeException()ステートメントを追加したりしないため、AOPが例外をキャッチしてからロールバックし、サービス上限(Webサービスクライアント、レイヤーアクションの表示)が例外をキャッチし、処理し続ける必要があります。
ソリューション2。追加:transactionAspectSupport.CurrentTransactionStatus()。setrollbackonly();上層層が例外を処理する必要がないように、サービスレイヤー法のキャッチステートメント、手動でロールバックの声明
要約します
上記は、Spring Transaction Exceptionロールバックインスタンスの分析に関するこの記事のすべての内容です。私はそれが誰にでも役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!