春のトランザクションのアノテーション@Transactional
トランザクション管理は、一般的に、プログラムと宣言型プログラミングスタイルの2種類を持っていること、またはコメントを経由してxmlファイルで設定されている直接コード、種類と評判の処理で物事を書くことは比較的プログラムであります非常に便利。
道@Transactionalによってコメントが共通しています。私たちは、ノートが起動クラスに追加したり、個別にハンドルにクラスを追加するように構成することができ、トランザクション管理機能を有効にするために@EnableTransactionManagement注釈を使用することができます。
1、トランザクションのアノテーション属性の
設定ファイル内に複数のTransactionManagerがある名前が、あなたはどのトランザクションマネージャの選択を指定するには、このプロパティを使用することができます。
トランザクションの伝播の伝播は、デフォルトでは必須です。
絶縁分離トランザクションは、デフォルトのDEFAULTとして使用しています。
タイムアウトトランザクションタイムアウト、デフォルト値は-1です。あなたが制限時間を超えたが、トランザクションが完了していない場合は、自動的にトランザクションをロールバックします。
読み取り専用トランザクションが読み取り専用トランザクションは、デフォルトはfalseで、指定された、トランザクション処理を無視する必要はありません、このようなデータを読み込むよう、読み取り専用trueに設定することができます。
ロールバックの例外タイプのトリガーは、トランザクションのロールバックを指定するために使用することができる複数の例外タイプを指定する必要がある場合、コンマ型によって分離することができます。
無rollback-トランザクションをロールバックしません指定されたため無ロールバック例外の型を投げるため。
伝播特性(業務の伝播)
必要なサポートサービスは、現在、それがトランザクションでない場合、新たなビジネスを作成し、既存の。
それがトランザクションでない場合は、既存のサポートサービスのMANDATORY、例外がスローされます。
トランザクションがいない場合は、単純に新しいビジネスを作成し、現在のトランザクションでネストされたトランザクションを作成し、ネストされました。
REQUIRES_NEWは、現在のトランザクションを中断トランザクションはしていない場合、あなたは、単に新たなビジネスを作成し、新しいトランザクションを作成します。
トランザクションを実行しない例外がスローされ、現在のトランザクションがある場合は、必須ではありません。
現在のトランザクションがある場合はNOT_SUPPORTED強制トランザクションは、トランザクションが保留され、実行されていません。
トランザクションはトランザクション内で実行していないされていない場合、支持体は、現在のトランザクションをサポートしています。
2、トランザクションアプリケーション
@Transactionalメソッドに追加することができ、この方法は、トランザクションの配置は、クラスレベルに加えてもよい示します。
また、クラスのレベルに追加することができます。クラスレベルの@Transactionalのアノテーションは、同じトランザクション属性情報で構成されたクラスのすべてのpublicメソッドを表す場合。
@Transactionalのクラスレベルの設定は、メソッドレベルも@Transactional、トランザクション管理サービスへのメソッドレベルの属性情報にアプリケーションを搭載した場合、すなわち、トランザクション属性はクラスレベルメソッドレベルの設定情報を上書きします。
図3は、トランザクションの動作原理
の宣言的トランザクション管理は、次の3つのコンポーネントで構成されています。
第総務
トランザクションマネージャ
EntityManagerのプロキシ自体は
総務カット
カットトランザクションは、ビジネス方法のフロントとバックアノテーションで「周り(サラウンド)」のセクションを呼び出すことができます。特定のクラスの側面を実装TransactionInterceptorです。カットトランザクションは、2つの主要な責任があります。
「前に」では、セクションでは、この方法は、ビジネスが継続中のトランザクションの範囲内で実行するか、新しい独立したビジネスを開始する必要があると呼ばれているかを決定するために、コールのポイントを提供します。
トランザクションがコミットまたはロールバックされると「の後」セクションの必要性を判断するために戻って実行し続けます。
「前」に、取引のアドバイス自体は、トランザクションマネージャを完了するために、新しいトランザクションを開始するかどうかの決定を委任、任意の決定ロジックが含まれていません。
トランザクションマネージャ
トランザクションマネージャの必要性は、以下の2つの問題に対処するには:
新しいエンティティマネージャを作成する必要があるかどうか?
私たちは、新しいビジネスを始めるべきであるかどうか?
ロジック「の前に」カットの決定が呼び出されると、これらは、総務を必要とします。次の2点に基づいて、トランザクションマネージャの決定:
トランザクションが進行中であるかどうか
伝播不動産取引方法(例えばREQUIRES_NEWなど、常に新しいトランザクションを開始したいです)
トランザクションマネージャを使用すると、必ず新しいトランザクションを作成したい場合は、以下となります。
新しいエンティティマネージャを作成します。
エンティティマネージャは、現在のスレッドにバインドされています
データベース接続プールから接続を取得
接続は、現在のスレッドにバインド
使用ThreadLocal変数のエンティティマネージャとデータベースの接続が現在のスレッドにバインドされています。彼らが実行すると、トランザクションは、それらを削除するかどうかを決定するために、彼らはもはや使用されているときに、スレッドに保存されていない、トランザクションマネージャれます。プログラムのどの部分が現在のエンティティマネージャとデータベースの接続が必要な場合は、スレッドからご利用いただけます。
EntityManagerのプロキシ
エンティティマネージャによって直接呼び出されていないビジネスメソッド呼び出しと同様のentityManager.persist()メソッド、しかし、代理店事業のメソッド呼び出した場合、スレッドにバインドされた管理し、物事マネージャエンティティので、エージェントはスレッドから現在のエンティティマネージャを取得します。
4、ノート
4.1 @Transactional注釈メソッドは、トランザクション管理を行うために、公衆に適用されます。AOPは、パブリックメソッドかどうかをインターセプトしますので。
コードをコピー
// AbstractFallbackTransactionAttributeSourceクラスを
protected TransactionAttribute computeTransactionAttribute(Method method,
Class<?> targetClass) {
// Don't allow no-public methods as required.
if (allowPublicMethodsOnly() && !Modifier.isPublic(method.getModifiers())) {
return null;
}
}
コードコピー
4.2伝播特性を
次の三つの伝播は、トランザクションを開始することはできません。3つの伝播の誤った設定、トランザクションのロールバックが発生しないことがあります。
TransactionDefinition.PROPAGATION_SUPPORTSは:現在のトランザクションが存在する場合は、トランザクションに追加され、何のトランザクション、非トランザクション方法場所は引き続き実行されていない場合。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:非トランザクションの実行は、現在のトランザクションが存在する場合は、保留中の現在のトランザクションを置きます。
TransactionDefinition.PROPAGATION_NEVER:非トランザクションの実行、現在のトランザクションが存在する場合は、例外がスローされます。
4.3 rollbackFor属性
デフォルトでは、未チェック(例外RuntimeExceptionから継承された)トランザクションで発生した例外またはエラーならば、春はトランザクションをロールバックし、また、春には、トランザクションをロールバックしません。
あなたは、例えば、ロールバックされたトランザクションをサポートするためにrollbackFor事によってでスローされた例外の他の種類を開発することができます。
@Transactional(伝播= Propagation.REQUIRED、rollbackFor = MyException.class)
ターゲット・プロセスでrollbackForが指定異常な異常なサブクラスは、トランザクションもロールバックされているスロー場合。
4.4デフォルトのプロキシモードでは、唯一のターゲットメソッドが外部によって呼び出され、Springのトランザクションインターセプターを傍受することができます。クラス内の同じ2つのメソッドを直接呼び出すには、Springのトランザクションインターセプターを傍受されることはありません
そのようなトランザクションが有効な方法ではない、請求同じクラスプラス制御トランザクションにおける次の二つの方法として、この方法は、次に、現在のクラス呼び出し、別の列に書き込むことです
コードをコピー
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void save() {
method();
。。。业务处理
if (true) {
throw new RuntimeException("save 抛异常了");
}
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void method() {
。。。业务处理
}
复制代码