ホームページ > Java > &#&チュートリアル > Spring のトランザクション管理設定におけるアノテーションの使用例の詳細な説明

Spring のトランザクション管理設定におけるアノテーションの使用例の詳細な説明

Y2J
リリース: 2017-05-02 11:47:47
オリジナル
1625 人が閲覧しました

この記事では、Spring のトランザクション管理設定におけるアノテーションの使用方法を主に紹介します。編集者が非常に優れていると考えたので、参考として共有します。エディターに従って見てみましょう

使用手順:

ステップ 1. Spring 構成ファイルに 名前空間を導入します

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
 http://www.springframework.org/schema/tx
 http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
ログイン後にコピー

ステップ 2. @Transactional アノテーションを持つ Bean は自動的に次のように構成されます宣言型トランザクションのサポート

<!-- 事务管理器配置, Hibernate单数据源事务 -->
  <bean id="defaultTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
  </bean>
  
  <!-- 使用annotation定义事务 -->
  <tx:annotation-driven transaction-manager="defaultTransactionManager" proxy-target-class="true" />
ログイン後にコピー

ステップ 3. インターフェイスまたはクラスの宣言に @Transactional を記述します。

インターフェイスにのみ記述する場合、インターフェイスの実装クラスをオーバーライドできます。クラス宣言時の設定

@Transactional //クラスレベルのアノテーション、クラス内のすべてのパブリックメソッドに適用可能

トランザクションの伝播動作と分離レベル

誰もがSpringアノテーションを使用しています 従来のトランザクション管理を使用する場合、トランザクションの伝播動作と分離レベルについて少し混乱するかもしれません。簡単に参照できるように、以下に詳細を示します。

Thing アノテーション メソッド: @Transactional

クラスの前にマークすると、クラス内のすべてのメソッドがトランザクション処理を実行することを示します。 例:

@Transactional
public class TestServiceBean implements TestService {}
ログイン後にコピー

クラス内の一部のメソッドがトランザクションを必要としない場合:

@Transactional
public class TestServiceBean implements TestService {  
  private TestDao dao;  
  public void setDao(TestDao dao) {
    this.dao = dao;
  }  
  @Transactional(propagation = Propagation.NOT_SUPPORTED)
  public List<Object> getAll() {
    return null;
  }  
}
ログイン後にコピー

物事 伝播動作の概要:

@Transactional(propagation=Propagation.REQUIRED)

トランザクションが存在する場合はトランザクションに参加し、存在しない場合は新しいトランザクションを作成します(デフォルト)

@ Transactional(propagation=Propagation.NOT_SUPPORTED)

コンテナはこのメソッドのトランザクションを開きません

@Transactional(propagation=Propagation.REQUIRES_NEW)

トランザクションが存在するかどうかに関係なく、新しいトランザクションが作成されます。新しいトランザクションが実行された後、古いトランザクションは継続されます。 @Transactional(propagation=Propagation.NEVER)

は既存のトランザクションで実行する必要があります トランザクションで実行されます。そうでない場合は例外がスローされます(Propagation.MANDATORYの反対)

@Transactional(propagation=Propagation.SUPPORTS)

他の Bean がこのメソッドを呼び出し、他の Bean でトランザクションを宣言する場合は、トランザクションを使用します。他の Bean がトランザクションを宣言しない場合、

Thing のタイムアウト設定は必要ありません:


( timeout=30) //デフォルトは30秒です

トランザクション分離レベル:

@Transactional(isolation = Isolation .READ_UNCOMMITTED)

コミットされていないデータの読み取り(ダーティリード、反復不可能なリードが発生します) 基本的には使用しません

@Transactional(isolation = Isolation.READ_COMMITTED)

コミットされたデータの読み取り(反復不可能な読み取りが発生します)およびファントム読み取り)

@Transactional(isolation = Isolation.REPEATABLE_READ)

反復可能な読み取り(ファントム読み取り)が発生します)

@Transactional(isolation = Isolation.SERIALIZABLE)

シリアル化

MYSQL: デフォルトは REPEATABLE_READ レベルです


SQLSERVER: デフォルトは READ_COMMITTED です


ダーティ リード: 1 つのトランザクションがコミットされていない更新データを読み取ります別のトランザクションから

Non-repeatable read: 同じトランザクション内で、同じデータを複数回読み取って返します。結果は異なります。つまり、


後続の読み取りでは、別のトランザクションによってコミットされた更新されたデータを読み取ることができます。 「反復可能な読み取り」は、同じトランザクション内でデータを複数回読み取る場合に、

読み取られるデータは同じであること、つまり、後続の読み取りでは、別のトランザクションによって送信された更新データを読み取ることができないことを保証できます

ファントム読み取り: 1 つのトランザクションが、送信された挿入データを読み取ります別のトランザクションによる

@Transactional アノテーションの共通パラメータの説明



パラメータ名

機能の説明単一の例外クラスを指定します: @Transactional(rollbackFor=RuntimeException.class)

readOnly

この属性は、現在のトランザクションがトランザクションであるかどうかを設定するために使用されます読み取り専用トランザクション。読み取り専用を示す場合は true、読み取り/書き込みを示す場合は false に設定します。デフォルト値は false です。例: @Transactional(readOnly=true)

rollbackFor

この属性は、指定された例外配列内の例外がスローされたときにロールバックする必要がある例外クラス配列を設定するために使用されます。メソッドを実行すると、トランザクションはロールバックされます。例:
複数の例外クラスを指定します: @Transactional(rollbackFor={RuntimeException.class, Exception.class})

表続き)

。 。

注意的几点:

1 @Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.

2用 spring 事务管理器,由spring来负责数据库的打开,提交,回滚.默认遇到运行期例外(throw new RuntimeException("注释");)会回滚,即遇到不受检查(unchecked)的例外时回滚;而遇到需要捕获的例外(throw new Exception("注释");)不会回滚,即遇到受检查的例外(就是非运行时抛出的异常,编译器会检查到的异常叫受检查例外或说受检查异常)时,需我们指定方式来让事务回滚 要想所有异常都回滚,要加上 @Transactional( rollbackFor={Exception.class,其它异常}) .如果让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)

如下:

 @Transactional(rollbackFor=Exception.class) //指定回滚,遇到异常Exception时回滚
public void methodName() {
 throw new Exception("注释");

 }
 @Transactional(noRollbackFor=Exception.class)//指定不回滚,遇到运行期例外(throw new RuntimeException("注释");)会回滚
public ItimDaoImpl getItemDaoImpl() {
 throw new RuntimeException("注释");
 }
ログイン後にコピー

3、@Transactional 注解应该只被应用到 public 可见度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错, 但是这个被注解的方法将不会展示已配置的事务设置。

4、@Transactional 注解可以被应用于接口定义和接口方法、类定义和类的 public 方法上。然而,请注意仅仅 @Transactional 注解的出现不足于开启事务行为,它仅仅 是一种元数据,能够被可以识别 @Transactional 注解和上述的配置适当的具有事务行为的beans所使用。上面的例子中,其实正是 元素的出现 开启 了事务行为。

5、Spring团队的建议是你在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。你当然可以在接口上使用 @Transactional 注解,但是这将只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承 的,这就意味着如果你正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装(将被确认为严重的)。因 此,请接受Spring团队的建议并且在具体的类上使用 @Transactional 注解。

以上がSpring のトランザクション管理設定におけるアノテーションの使用例の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート

パラメータ名

関数の説明

rollbackForClassName

この属性は、必要な例外クラス名の配列を設定するために使用されます。ロールバックする場合、指定された例外名の配列内の例外がメソッドでスローされると、トランザクションはロールバックされます。例:

単一の例外クラス名を指定します: @Transactional(rollbackForClassName="RuntimeException")

複数の例外クラス名を指定します: @Transactional(rollbackForClassName={"RuntimeException","Exception"})

noRollbackFor

この属性は、ロールバックを必要としない例外クラスの配列を設定するために使用されます。指定された例外配列内の例外がメソッドでスローされた場合、トランザクションはロールされません。戻る。例:

単一の例外クラスを指定します: @Transactional(noRollbackFor=RuntimeException.class)

複数の例外クラスを指定します: @Transactional(noRollbackFor={RuntimeException.class, Exception.class})

noRollbackForClassName

この属性は、ロールバックする必要のない例外クラス名の配列を設定するために使用されます。指定された例外名配列内の例外がメソッドでスローされると、トランザクションはロールバックされます。ロールバックされません。例:

単一の例外クラス名を指定します: @Transactional(noRollbackForClassName="RuntimeException")

複数の例外クラス名を指定します:

@Transactional(noRollbackForClassName={"RuntimeException","Exception") )

propagation

この属性は、トランザクションの伝播動作を設定するために使用されます。具体的な値については、表 6-7 を参照してください。

例: @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)

isolation

この属性は、基礎となるデータベースのトランザクション分離レベルを設定するために使用されます。トランザクション分離レベルが使用されます。複数トランザクションの同時実行を処理するために、通常はデータベースのデフォルトの分離レベルを使用できます。

timeout

このプロパティは、トランザクションのタイムアウト秒数を設定するために使用されます。デフォルトの値 -1 は、タイムアウトしないことを意味します