総務呼び出しは失敗します
トランザクションが別の方法情勢が注釈を付けているサービスのmainメソッドを呼び出し、サービスコールのmainメソッドに注釈を追加しなかった場合は、同じサービス内で、この注釈は有効になりません。
その主な理由は、トランザクションがAOPによって実装されていることで、プロキシオブジェクトのメソッド呼び出しの事項コメントがあり、トランザクションを有効にします。
オブジェクトがもはやターゲットであるプロキシオブジェクトではありませんが、このオブジェクト自体は、他の方法は、もはや向上させることができたときに同じクラスのサービス、ダイレクトコールサービスプロキシクラスの唯一の方法を向上させることができ、他ので、内部クラスを呼び出していません事務の方法が効果を取ることができません
あなたは、mainメソッド事務を追加する別の方法情勢を使用することができるようにしたくない場合は、トランザクションプラスメソッドを呼び出すために、プロキシオブジェクトを取得する必要があります
いくつかの方法があります。
プロキシオブジェクト1. Springコンテキストを取得します。
@Autowired 民間のApplicationContextのApplicationContext。 @オーバーライド @Transactional パブリック整数saveUserInfo(のUserInfo userInfoParam){ ユーザー情報のUserInfo = userInfoRepository.save(userInfoParam)。 もし(真){ スロー 新しいのRuntimeExceptionを(); } リターンuserInfo.getId(); } @オーバーライド 公共 ボイド試験(のUserInfo userInfoParam){ UserInfoService IUserInfoService = applicationContext.getBean(。IUserInfoServiceにクラス);
//コール注釈付きクラスに加えて、取引の方法 userInfoService.saveUserInfo(userInfoParam)。 }
Aopとによって現在のプロキシオブジェクトコンテキストを取得します。2.
@EnableAspectJAutoProxy(exposeProxy =真):AOP exposeProxyプロパティが露出プロキシオブジェクトを開く必要があります
使用AopContext.currentProxyは()現在のプロキシオブジェクトを取得します
@オーバーライド @Transactional パブリック整数saveUserInfo(のUserInfo userInfoParam){ ユーザー情報のUserInfo = userInfoRepository.save(userInfoParam)。 もし(真){ スロー 新しいのRuntimeExceptionを(); } リターンuserInfo.getId(); } @オーバーライド 公共 ボイド試験(のUserInfo userInfoParam){ UserInfoService IUserInfoService = (IUserInfoService)AopContext.currentProxy(); //クラスプラストランザクションアノテーション付きメソッド呼び出し userInfoService.saveUserInfo(userInfoParam)。 }
@Autowired通じ3.直接注入
@Autowired
プライベートIUserInfoService userInfoService。
異常なロールバック
使用@Transaction注釈、デフォルトのロールバックはのRuntimeExceptionとエラーの異常型をロールバックします
TransactionAspectSupport管理セクション、改良された方法の例外エントリcompleteTransactionAfterThrowing()メソッドで撮影した場合
試す{ // 呼び出しチェーン内の次のインターセプタ:これは、周りのアドバイスです。 // これは、通常、ターゲットオブジェクトが呼び出されることになります。 RETVAL = invocation.proceedWithInvocation()。 } キャッチ(ThrowableのEX){ // ターゲット呼び出し例外 completeTransactionAfterThrowing(txInfo、EX)。 スローEXを。 } 最終的には{ cleanupTransactionInfo(txInfo)。 }
rollbackOn()メソッドは、唯一の例外はRuntimeExceptionををキャッチされ、デフォルトでは、ロールバックするかどうかを判断し、エラーの種類は、トゥーレを返します。
@Override パブリック ブールrollbackOn(ThrowableのEX){ リターン(元のinstanceofのRuntimeException || EX instanceofのエラー)。 }
@Transactionアノテーションは、属性値、制御誤差のロールバックを提供することができます。
rollbackFor
rollbackForClassName
noRollbackFor
noRollbackForClassName
例:
例外コード例外の種類及びサブクラス以下のキャプチャではなく、キャッチエラーエラー
@オーバーライド @Transactional(rollbackFor =例外。クラス)//あなたはすべての例外をキャッチしたい場合は記述する必要があります= Throwable.class rollbackFor 公共整数saveUserInfo(のUserInfo userInfoParam){
ユーザー情報のUserInfo = userInfoRepository.save(userInfoParam)。 もし(真){ スロー 新しいエラーを(); } リターンuserInfo.getId(); }
加えて、次のコードをキャプチャ InterruptedExceptionある、とClassNotFoundExceptionのより異常
@オーバーライド @Transactional(noRollbackForClassName = { "InterruptedExceptionある"、 "にClassNotFoundException" }) パブリック整数saveUserInfo(のUserInfo userInfoParam)はスローInterruptedExceptionある、ClassNotFoundExceptionが{ ユーザー情報のUserInfo = userInfoRepository.save(userInfoParam)。 もし(真){ スロー 新しいClassNotFoundExceptionが(); } リターンuserInfo.getId(); }