デフォルトでは、春はキャッチされていないruntimeexcetpionがある場合にのみロールバックします。
最も愚かな方法:コードレベルの制御:TransactionAspectSupport.currentTransactionStatus()。setRollbackOnly();
aop advitorでrollba-for = "java.lang.Exception"が設定されているのに、なぜロールバックされないのですか?
問題が解決しました:
原則:Spring aop例外キャプチャの原則:インターセプトされたメソッドは例外を明示的にスローする必要があり、いかなる方法でも処理できないため、aopエージェントはメソッドの例外をキャッチしてロールバックできます。デフォルトでは、aopは例外のみをキャプチャします。ただし、
<tx:method name = "upd *" propagate = "REQUIRED" rollback-for = "java.lang.Exception" />の構成を通じて、
特定の例外をキャプチャしてロールバックすることができます。
つまり、serviceメソッドでtry catchを使用したり、catchの最後にthrow new runtimeexcetpion()を追加したりしないでください。これにより、プログラムが異常な場合に、aopによってキャッチされてロールバックされる可能性があります。
解決:
解決策1.たとえば、サービスレイヤーがトランザクションを処理する場合、サービス内のメソッドが例外キャプチャを実行しないか、catchステートメントの最後にthrow new RuntimeException()ステートメントが追加され、aopが例外をキャッチして次にロールバックし、サービスの上位層(Webサービスクライアント、ビュー層のアクション)で、この例外をキャッチして処理し続けます
オプション2.サービスレイヤーメソッドのcatchステートメントを追加します。TransactionAspectSupport.currentTransactionStatus()。setRollbackOnly();ステートメント、手動ロールバック。これにより、上位レイヤーが例外を処理する必要がなくなります(現在のプロジェクトアプローチ)。
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="upd*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
<tx:method name="del*" propagation="REQUIRED" />
<tx:method name="*" propagation="SUPPORTS" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="canyin" expression="execution(* com.laphone.base.baseservice.*.*(..)) ||execution(* com.laphone.canyin.*.service.*.*(..)) || execution(* com.laphone.canyin.*.*.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="canyin" />
</aop:config>
人生は忍耐と勤勉以上のものです。夢は意味のある追求です。
最後に、あなたの研究の早い段階での成功、満足のいくオファー、迅速な昇進と給料の引き上げ、そして人生の頂点に到達することを願っています。
小さなアシスタントvxを追加するためにコースウェアのソースコードソフトウェアやその他の資料が必要な場合:xcw18874131605(注:CSDN