Springトランザクションの管理2

10978 ワード

引用する
ソフトウェアでは、すべてある(すべて発生)か、すべてない(すべて発生していない)かの操作をトランザクションと呼びます.
Springのトランザクション管理はspringのキャッシュメカニズムと同様にspringのAOPに基づいているため、springのトランザクション管理はspringのキャッシュメカニズムと構成的に非常に似ている.Springのトランザクション管理には、プログラミングトランザクション、xmlベースの構成トランザクション、注釈駆動トランザクションが含まれます.この3つのトランザクション管理について説明します.
スプリングトランザクション管理について説明する前に、トランザクションのパラメータについて説明する必要があります.
1.springトランザクションパラメータ
Springトランザクションパラメータorg.springframework.transaction.TransactionDefinitionインタフェースで定数定義が作成されています.
1.1伝播挙動(PROPAGATION)
トランザクションの伝播動作
でんぱんきょどう
意味
PROPAGATION_MANDATORY
メソッドがトランザクションで実行される必要があることを示します.現在トランザクションが発生していない場合は、例外が放出されます.
PROPAGATION_NESTED
現在進行中のトランザクションがある場合、メソッドはネストされたトランザクションで実行される必要があります.ネストされたトランザクションは、カプセル化されたトランザクションとは独立してコミットまたはロールバックできます.パッケージトランザクションが存在しない場合は、PROPACATIONのような動作をします.REQUIRDと同じです.このような伝播行為に対する各メーカーのサポートはバラバラであることに注意してください.ネストされたトランザクションがサポートされているかどうかを確認するには、エクスプローラのドキュメントを参照してください.
PROPAGATION_NEVER
現在のメソッドがトランザクションコンテキストで実行されるべきではないことを示します.トランザクションが現在実行されている場合は、例外が放出されます.
PROPAGATION_NOT_SUPPORTED
メソッドがトランザクションで実行されるべきではないことを示します.既存のトランザクションが進行中の場合、メソッドの実行中に保留されます.
PROPAGATION_REQUIRED
現在のメソッドがトランザクションで実行される必要があることを示します.既存のトランザクションが進行中の場合、メソッドはそのトランザクションで実行されます.そうでなければ、新しいトランザクションが開始されます.
PROPAGATION_REQUIREDS_NEW
現在のメソッドが独自のトランザクションで実行される必要があることを示します.新しいトランザクションが開始され、既存のトランザクションが実行されている場合は、このメソッドの実行中に保留されます.JTATransactionManagerを使用している場合は、TransactionManagerにアクセスする必要があります.
PROPAGATION_SUPPORTS
現在のメソッドにはトランザクションコンテキストは必要ありませんが、トランザクションがすでに実行されている場合は、このトランザクションで実行できます.
1.2トランザクション独立性レベル
Springのトランザクション独立性レベル
独立性レベル
意味
ISOLATION_DEFAULT
バックエンド・データベースのデフォルトの独立性レベルの使用
ISOLATION_READ_UNCOMMITTED
コミットされていない変更の読み取りを許可します.汚れた読み取り、幻の読み取り、または繰り返し不可能な読み取りを引き起こす可能性があります.
ISOLATION_READ_COMMITED
コミットされた同時トランザクションからの読み取りを許可します.汚れた読み取り、幻の読み取り、または重複しない読み取りを防止
ISOLATION_REPEATABLE_READ
現在のトランザクション自体によってデータが変更されない限り、同じフィールドの複数回の読み取りの結果は一致します.汚れた読み取りと重複しない読み取りを防止できますが、幻の読み取りは発生します.
ISOLATION_SERIALIZABLE
ACIDの独立性レベルに完全に従い、汚れた読み取り、重複しない読み取り、幻の読み取りが発生しないことを確認します.これは、通常、現在のトランザクションに関連するデータテーブルを完全にロックすることによって達成されるため、すべての独立性レベルで最も遅い.
1.3読み取り専用
トランザクションがバックエンド・データベースに対してのみ読み取り操作を実行する場合、データベースはそのトランザクションの読み取り専用特性を利用して、いくつかの最適化措置をとることができます.読み取り専用の最適化は、トランザクションの開始時にバックエンド・データベースによって実行されるため、新しいトランザクションを開始する可能性のある伝播動作(PROPAGATION_REQUIRD、PROPAGATION_REQUIRDS_NEW、PROPAGATION_NESTED)を有する方法でのみ、トランザクションを読み取り専用と宣言することに意味があります.
1.4取引タイムアウト
トランザクションを宣言し、特定の秒数後に自動的にロールバックし、自分で終了する必要はありません.
1.5ロールバック規則
ロールバック・ルールでは、ロールバックが発生する例外と発生しない例外を定義します.デフォルトでは、トランザクションは実行例外(runtime exception)が発生した場合にのみロールバックされ、ブロックされた例外(checked exception)が発生した場合にロールバックされません.ただし、ロールバック・ルールで、トランザクションが特定のブロックされた例外が発生したときに実行時の例外のようにロールバックされることを宣言することもできます.同様に、トランザクションが実行時例外を含む特定の例外が発生した場合にロールバックしないことを宣言することもできます.
2.springのトランザクションマネージャ
SpringのトランザクションマネージャAOPのAdviceです!あるいはこのように理解することができます!トランザクションマネージャには、トランザクション管理の機能コードが含まれています.
Springは、特定の永続プラットフォームに基づく複数のトランザクションマネージャを提供し、これらのトランザクションマネージャはorgを実現しています.springframework.transaction.PlatformTransactionManager.
次はjdbcのトランザクションマネージャの構成です(他の永続プラットフォームのトランザクションマネージャの構成は似ています).
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"></property>
</bean>

3.XML方式によるトランザクションの構成
3.1代理事務
<bean id="rantService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  <property name="target" ref="rantServiceTarget" />
  <property name="proxyInterfaces" value="com.roadrantz.service.RantService" />
  <property name="transactionManager" ref="transactionManager"></property>
  <property name="transactionAttributes">
    <props>
      <prop key="add*">PROPAGATION_REQUIRED</prop>
      <prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>
    </props>
  </property>
</bean>

TransactionAttributesの構成は次の順序で行われます.
PROPAGATION,ISO LATION(オプション),readOnly(オプション),-EXception(オプション),+Exception(オプション)
3.2 spring2.0トランザクションのシンプルな構成
<tx:advice id="txAdvice" transaction-manager="transactionManager">       
  <tx:attributes>
    <tx:method name="add*" propagation="REQUIRED" />
    <tx:method name="*" propagation="SUPPORTS" read-only="true" />
  </tx:attributes> </tx:advice>
<aop:config>        
  <aop:advisor advice-ref="txAdvice" pointcut="execution(* *..RantService.*(..))" />
</aop:config>

4.注記駆動トランザクション構成
  • 次の構成を追加
    <tx:annotation-driven transaction-manager="transactionManager"/>

     
  • 対応するクラスのクラスレベルまたはメソッドレベルに@Transactional注記を追加
    @Transactional(propagation=Propagation.SUPPORTS,readOnly=true)
    public class RantServiceImpl implements RantService{...
      @Transactional(propagation=Propagation.REQUIRED,readOnly=false)
      public void addRant(Rant rant){
      ..............
      ..............
      }
    }

     

  • 5.プログラミングトランザクション管理
    (略)
     
    <回転:http://www.189works.com/article-81234-1.html>