Springにおける事務伝播属性の詳細

4565 ワード

文章は悪くないです.転載は以下の通りです.http://developer.51cto.com/art/200812/102708.htm
 
 
Springを使う時、彼の声明式の事務を使って、簡単に配置ファイルの中でいくつか規則の配置を行って、SpringのAOP機能を利用して簡単に事務問題を解決することができます.この中は一つの事務の伝播属性問題Propgationに関連しています.これはTransaction Definitionインターフェースで定義されています.Platofrom Transactionagerに使用されています.Platofrom Transactionagerはspring事務管理の核心インターフェースです.
TransactionDefinition 
public interface TransactionDefinition { 
 int getPropagationBehavior(); 
 int getIsolationLevel(); 
 int getTimeout(); 
 boolean isReadOnly(); 
} 
 
 
get Timeout()方法は、トランザクションに戻るには何秒以内に完了する必要がありますか?
 
ISReadOnly()は、トランザクションが読み取り専用かどうか、トランザクションマネージャは、この戻り値に基づいて最適化され、トランザクションが読み取り専用であることを保証する.
 
get Isolation Level()方法は、トランザクションの分離レベルに戻り、事務マネージャは、それに基づいて他のトランザクションを制御することによって、本トランザクション内のどのデータが見られますか?
 
Transaction Definitionインターフェースで5つの異なる事務分離レベルを定義しました.ISO LATION_DEFAULT Platofrom Transactionagerのデフォルトの分離レベルです.データベースのデフォルトの事務分離レベルを使います.他の四つはJDBCの分離レベルに対応しています.ISO LATION_.READ_UNCOMMITTEDこれは事務レベルが一番低いので、他の事務を担当しているので、この事務未提出のデータを見ることができます.このような隔離レベルは汚い読みを生じ、繰り返して読んではいけません.
 
Transation Definitionインターフェースには7つのオプションがあります.
 
PROPAAGATION_REQUIRED:現在の事務をサポートしています.もし現在は事務がないなら、新しい事務を作ります.これは一番よくある選択です.
 
PROPAAGATION_SUPPORTS:現在の事務をサポートしておりますが、現在は事務がない場合は非事務で行います.
 
PROPAAGATION_MANDATORY:現在の事務をサポートしていますが、今は仕事がないと異常を投げます.
 
PROPAAGATION_REQUIRES_NEW:新規事務は、現在の事務があれば、現在の事務を保留します.
 
PROPAAGATION_NOT_SUPPORTED:非事務的に操作を行い、現在の事務があれば、現在の事務を保留します.
 
PROPAAGATION_NEVER:非事務的に実行し、現在事務が存在すれば、異常を抛り出す.
 
PROPAAGATION_NESTEP:現在のトランザクションをサポートし、Savepointポイントを追加し、現在のトランザクションと同期して提出またはロールバックします.
 
一例に関連して、上記の様々な伝播属性を適用して説明します.まず、二つのbean:ServiceAとServiceBを宣言します.ここでServiceBは引用されます.
 ServiceA { 
         void methodA() { 
             ServiceB.methodB(); 
         } 
    } 
    ServiceB {
         void methodB() { 
         } 
    } 
 
 
 
次に、私達は一つ一つ分析します.
 
PROPAAGATION_REQUIRED
 
現在実行している事務に加入すると、他の事務にはありません.例えば、ServiceB.methodBの事務レベルはPROPAAGATION_と定義されています.REQUIREDは、ServiceA.methodAを実行するために、ServiceA.methodAがすでに事務を開始しています.ここでServiceB.methodBを呼び出して、ServiceB.methodBはServiceA.methodAの事務内で動作しているのを見て、新しい事務を再起動しません.ServiceA.methodAが実行していると、自分が事務中でないことに気づき、彼は自分のために事務を割り当てることになります.このように、ServiceA.methodAまたはServiceB.methodB内のどこにも異常が発生し、事務はロールバックされます.ServiceB.methodBのトランザクションが既に提出されていても、ServiceA.methodAは次のfailでロールバックします.ServiceB.methodBもロールバックします.
 
PROPAAGATION_SUPPORTS
 
現在、事務中であるならば、即ち事務の形で運行し、現在もう一つの事務中でないなら、非事務の形で運行する.
 
PROPAAGATION_MANDATORY
 
一つのビジネスで実行しなければなりません.つまり、彼は父親の事務にしか呼び出されません.さもないと、彼は異常を捨てようとします.
 
PROPAAGATION_REQUIRES_NEW
 
例えば、私たちがServiceA.methodAを設計する事務レベルはPROPAAGATIONです.REQUIRED、ServiceB.methodBの事務レベルはPROPAAGATIONです.REQUIRES_NEWは、ServiceB.methodBに実行されると、ServiceA.methodAの所属する事務が保留され、ServiceB.methodBは新しい事務を開始し、ServiceB.methodBの事務が完了するのを待って、彼は続けて実行します.彼とPROPAAGATIONREQUIREDの事務の違いは、事務のロールバックの程度にあります.ServiceB.methodBは新しいビジネスを始めるので、二つの違いがあります.ServiceB.methodBがすでに提出されているなら、ServiceA.methodAは失敗してロールバックします.ServiceB.methodBはロールバックしません.ServiceB.methodBが失敗したらロールバックします.もし彼が投げた異常がServiceA.methodAによって捕捉されたら、ServiceA.methodA事務はまだ提出されます.
 
PROPAAGATION_NOT_SUPPORTED
 
現在は事務をサポートしていません.例えばServiceA.methodAの事務レベルはPROPAATIONです.REQUIRED、ServiceB.methodBの事務レベルはPROPAAGATIONです.NOT_SUPPORTEDは、ServiceB.methodBに実行されると、ServiceA.methodAの事務が保留され、彼は非事務の状態で運転が完了し、ServiceA.methodAの事務を継続します.ネットマネジメント連盟BitsCNcom
 
PROPAAGATION_NEVER
 
事務中は運転できません.ServiceA.methodAの事務レベルがPROPAATIONであると仮定する.REQUIRED、ServiceB.methodBの事務レベルはPROPAAGATIONです.NEVERではServiceB.methodBが異常を投げます.
 
PROPAAGATION_NESTEP
 
Nestedを理解するコツはsavepointです.彼とPROPAAGATIONREQUIRES_NEWの違いは、PROPAAGATION_REQUIRES_NEWはもう一つの事务を始めます.彼の父と独立して、Nestedの事务と彼の父の事务は互いに依存しています.彼の提出は彼の父の事务と一绪に提出するのを待ちます.つまり、父の仕事が最後にロールバックすれば、彼もロールバックします.Nestedの事务の利益も彼がsavepointを持っています.
ServiceA { 
        void methodA() {             
       try { 
                ServiceB.methodB(); 
            } catch (Exception e) {  
                ServiceC.methodC(); 
            }  
        }  
    } 
 
 
 
つまりServiceB.methodBは失敗してロールバックします.ServiceA.methodAはsavepointポイントにロールバックします.ServiceA.methodAはもう一つの分岐を選択できます.例えばServiceC.methodCは引き続き実行して、自分の事務を完成させてみます.しかし、この事務はEJB規格では定義されていません.