@Transactional (noRollbackFor=RuntimeException.class)
public void methodA (Entity e){
service.methodB(e);
}
をロールバックすることを妨げない---以下、サービス方法---@Transactional(noRollbackFor = RuntimeException.class)のRuntimeException
@Transactional (propagation=Propagation.REQUIRES_NEW, noRollbackFor=RuntimeException.class)
public void methodB (Entity e){
dao.insert(e);
}
methodB()
でdao.insert(e)
主キー違反が発生し、ConstraintViolationException
をスローこれはRuntimeException
のサブクラスですが、私が使用したnoRollbackFor
というプロパティのためにトランザクションがコミットされると思います。それがロールバック専用としてマークされているので、 トランザクションがロールバック:しかし、私は(methodA
上の)外側のトランザクションがまだメッセージ
org.springframework.transaction.UnexpectedRollback例外で
HibernateTransactionManager
によってロールバックされていることを観察しました
同様の質問が報告されていますが、これは正確ではありません。例外がキャッチされると
はあなたが偽例えばにglobalRollbackOnParticipationFailureを設定しました:emailServiceは <プロパティ名= "sessionFactory" ref = "sessionFactory" –
sol4me
SendMailFailureException
をスローした場合、あなたはそれがこの例外をキャッチする際にロールバックすることはないGatewayServiceのを指示することができます。確かにsol4meは正しい軌道にあります - http://stackoverflow.com/a/11205537/1594449を参照してください。 – gknicker
私は素晴らしいアイディアのようですが、私は 'globalRollbackOnParticipationFailure'の設定を変更したくはありません。すでに同じトランザクションマネージャを使用している既存のモノリシックなコードを強化しています。既存のコードを自分の変更に影響されないようにしたいと思っています。これはtxマネージャの設定を変更することによって実現可能には見えません。 変更に固有の何かを行うことはできますか? – ThermalEagle