Spring traction事務roll back各種ロールバック

5202 ワード

SpringのAOP事務管理はデフォルトでuncheced exceptionに対してロールバックします.
つまりデフォルトでは、RuntimeException()異常極子類に対して事務ロールバックを行います.
Exceptionはベースとして、以下はcheced exceptionとuncheced exceptionに分けられます.クライアントが他の方法で異常を回復することができると、このような異常が発生します.
常にcheced exceptionです.このような異常に対してクライアントが無力であれば、この異常はアンチェクexceptionです.簡単に言えば
RuntimeExceptionのは全部uncheced exceptionです.
Error:1.常に制御できない(unchecked)2.システムエラーまたは低レベルリソースのエラーを表すためによく使われます.3.どのように可能であれば、システムレベルで捕捉されるべきですか?
Exception:1.制御され得るか、制御されないかを示す2.プログラマによるエラーを表す3.アプリケーションレベルで処理されるべきです.
Javaには2種類の異常が定義されています.1)Checked exception:これらの異常はすべてExceptionのサブクラスです.異常な上向きのメカニズムで処理しますが、サブクラスにA異常が発生する可能性があります.
throws Aも異常でなければなりません.結果として生じる問題:コードの効率が低く、結合度が高すぎる.2)アンチテークexception:これらの異常はいずれもRuntimeExceptionのサブクラスです.RuntimeExceptionも同じくExceptionのサブクラスですが、それらはです.
例外的に、それらはclient codeによって解決しようとしないので、Unicheced exceptionと呼ばれています.
解決策:
1.Exceptionを投げ出すのではなく、トランザクションに対するクラスにRuntimeExceptionの異常を投げます.
2.txAdiveにrollback-forを追加し、自分のexceptionを書いて、例えば自分で書いたexceptionは
comp.cn.untils.exception.**Exception
          
または
ロールしない異常を定義します.
                     
spring事務はロールバックします.デフォルトの状況、unchecked異常、つまり運行時異常runntimeExceptionロールバック事務です.checked異常、つまりException try{}捕獲可能なロールバックしません.もちろん、springパラメータを設定してロールバックさせてもいいです.
試験方法:
         ユニットテストを書いて、service層の方法を呼び出します.
 
 
試験プロセス:
         serviceを定義する方法は以下の通りです.
         public SMSTiming createSMSTiming(SMSTiming sTiming){
                   SMSTiming s= this.get Sms TimingDAO().createSMSTiming(sms Timing)
                   return s;
         }
 
         二つの異常を定義します(まずデフォルト設定TestExceptionはSpringトランザクションのロールバック異常です):
            publicclass MyTest Exception extens Exception
            publicclass Test Exception extens Exception
 
         注意してみてください.この方法は毎回違います.
 
テスト1:
public SMSTiming createSMSTiming(SMSTiming sTiming){
       SMSTiming s= this.get Sms TimingDAO().createSMSTiming(sms Timing)
       要点 i=4/0 //人為的に異常が発生しました(実際にここではArthmeticException運転異常を投げました)
       return s;
    }
テスト1の結果:事務のロールバックができます.データベースに新しいデータが挿入されていません.
 
 
テスト2:
        public SMSTiming createSMSTiming(SMSTiming sTiming) ローソン Exception{//検査異常(非運転異常)は投げ出さなければなりません.
       SMSTiming s= this.get Sms TimingDAO().createSMSTiming(sms Timing)
       try{
           要点 i=4/0 //人為的に異常をきたす
       }catch(Exception e){
           thrownew Exception (「"」)//Exception異常を飛ばす
       }
       return s;
    }
テスト2の結果:ビジネスのロールバックができません.データベースに新しいデータを挿入します.
 
        
テスト3:
            public SMSTiming createSMSTiming(SMSTiming sTiming) ローソン RuntimeException{/運転異常(検査以外の異常)は投げ出さなくてもいいです.
       SMSTiming s= this.get Sms TimingDAO().createSMSTiming(sms Timing)
       try{
           要点 i=4/0 //人為的に異常をきたす
       }catch(Exception e){
           thrownewRuntimeException(")//RuntimeException異常を飛ばす
       }
       return s;
    }
テスト3結果:事務のロールバックができます.データベースに新しいデータが挿入されていません.
 
テスト4:
        public SMSTiming createSMSTiming(SMSTiming sTiming) ローソン Test Exception{//検査異常(非運転異常)は投げ出さなければなりません.
       SMSTiming s= this.get Sms TimingDAO().createSMSTiming(sms Timing)
       try{
           要点 i=4/0 //人為的に異常をきたす
       }catch(Exception e){
           thrownewTest Exception(")//Test Exceptionを投げ出す異常
       }
       return s;
    }
テスト4結果:事務のロールバックができます.データベースに新しいデータが挿入されていません.
 
テスト5:
    public SMSTiming createSMSTiming(SMSTiming sTiming) ローソン MyTest Exception{/検査異常(運行異常ではない)は投げ出さなければなりません.
       SMSTiming s= this.get Sms TimingDAO().createSMSTiming(sms Timing)
       try{
           要点 i=4/0 //人為的に異常をきたす
       }catch(Exception e){
           thrownewMyTest Exception(")//MyTest Exceptionを投げ出す異常
       }
       return s;
    }
 テスト5結果:事務のロールバックができません.データベースに新しいデータを挿入します.
 
テスト6:
    public SMSTiming createSMSTiming(SMSTiming sTiming) ローソン MyTest Exception{/検査異常(運行異常ではない)は投げ出さなければなりません. (注意:この時のspringはこの異常ロールバックの設定を指定します)
       SMSTiming s= this.get Sms TimingDAO().createSMSTiming(sms Timing)
       try{
           要点 i=4/0 //人為的に異常をきたす
       }catch(Exception e){
           thrownewMyTest Exception(")//MyTest Exceptionを投げ出す異常
       }
       return s;
    }
 テスト6の結果:事務のロールバックができます.データベースに新しいデータが挿入されていません.
 
 
試験まとめ:
テスト1、テスト3、テスト4、テスト6は事務のロールバックを行います.テスト2、テスト5は事務のロールバックを行いません.
 
なぜですか?異常タイプ(検査異常、運転時異常)なので、Springを使ったrollback-forの配置が違います.
 
テスト1とテスト3は、運転中に異常が発生したため、仕事がロールバックします.
 
テスト4とテスト5、テスト6はそれぞれテスト異常Test Exception、MyTest Exceptionを投げます.なぜテスト4とテスト6は仕事がロールバックしますか?
Spring事務配置でこの異常を指定しましたので(rollback-forを指定します).
 
 
Springフレームのトランザクションインフラコードはデフォルトで のみ 運転中にunchecked exceptionsを投げ出した時に、事務のロールバックを識別します.つまり、RuntimeExceptionを投げ出した時です. または、そのサブクラスの例の場合(Errors) 同様に-デフォルトで-マークのトランザクションがロールバックします.)ビジネスメソッドから投げ出されたChecked exceptions いいえ、 マークされて事務ロールバックを行います.