ホームページ  >  記事  >  Java  >  Spring トランザクション管理の関連概要 (コード付き)

Spring トランザクション管理の関連概要 (コード付き)

不言
不言転載
2018-10-09 14:34:332660ブラウズ

この記事は Spring トランザクション管理の概要 (コード付き) です。必要な方は参考にしていただければ幸いです。

トランザクション

操作の論理的なグループ。操作の各部分は成功または失敗します。

トランザクションの特性

  • 一貫性: トランザクションの前後のデータ整合性は一貫性を保ちます

  • 原子性: トランザクションは分割できず、すべて成功するかすべて失敗します

  • 分離: トランザクションの実行は他のトランザクションの影響を受けず、相互に分離されます

  • 永続性: トランザクションは完了するとデータベースに保存され、影響を受けませんシステムによるクラッシュの影響

特性が満たされていない場合に発生する問題

分離によって発生する問題:

質問を読む

  • ダーティ リード: トランザクションは、他のトランザクションによってコミットされていないデータを読み取ります。

  • Non-repeatable read: トランザクションは、他のトランザクションによって送信されたデータを読み取りますUpdate データにより、複数回一貫性のないクエリ結果が発生します。

  • ファントム読み取り: 1 つのトランザクションが、別のトランザクション から挿入 データを読み取るため、一貫性のないクエリ結果が発生します。複数回

書き込み問題

  • 操作損失

読み取り問題の解決

トランザクション分離レベルの設定

Spring トランザクション管理の関連概要 (コード付き)

   int ISOLATION_DEFAULT = -1;
    int ISOLATION_READ_UNCOMMITTED = 1;
    int ISOLATION_READ_COMMITTED = 2;
    int ISOLATION_REPEATABLE_READ = 4;
    int ISOLATION_SERIALIZABLE = 8;
  • ISOLATION_DEFAULT: 春のデフォルト値を表し、基礎となるデータベースのデフォルト分離レベルが使用されることを示します。たとえば、mysql は ISOLATION_REPEATABLE_READ を使用し、ISOLATION_READ_COMMITTEDを使用します

  • ISOLATION_READ_UNCOMMITTED: コミットされていない読み取り、読み取りの問題を解決できません

  • ISOLATION_READ_COMMITTED: コミットされた読み取り、解決できますダーティな問題読み取り、ファントム リードと非反復読み取りは解決できません

  • ISOLATION_REPEATABLE_READ: 反復読み取り、ダーティー リードと非反復読み取りは解決できます

  • # #ISOLATION_SERIALIZABLE: すべての読み取り問題を解決できますが、効率は高くありません

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

PlatformTransactionManager: プラットフォーム トランザクション マネージャー

PlatformTransactionManager はインターフェイスです。 Spring オブジェクトの最下層でトランザクションを管理するために使用されます。

Spring トランザクション管理の関連概要 (コード付き)

public interface PlatformTransactionManager {
    TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
    void commit(TransactionStatus status) throws TransactionException;
    void rollback(TransactionStatus status) throws TransactionException;
}

spring things 公式 Web サイトのアドレスより一般的な実装クラスは次のとおりです:

  1. DataSourceTransactionManager: 一番下層は JDBC トランザクション管理を使用します

  2. HibernateTransactionManager: 最下層は Hibernate トランザクション管理を使用します

  • TransactionDefinition:

    Transaction定義: トランザクションを定義できます。 関連情報、トランザクションの伝播動作、分離レベル、タイムアウト情報、読み取り専用かどうか

  • package org.springframework.transaction;
    
    //可以看到事物的定义也是一个接口
    public interface TransactionDefinition {
        //事物的传播行为,7种
        int PROPAGATION_REQUIRED = 0;
        int PROPAGATION_SUPPORTS = 1;
        int PROPAGATION_MANDATORY = 2;
        int PROPAGATION_REQUIRES_NEW = 3;
        int PROPAGATION_NOT_SUPPORTED = 4;
        int PROPAGATION_NEVER = 5;
        int PROPAGATION_NESTED = 6;
        
        //事物的隔离级别五种
        int ISOLATION_DEFAULT = -1;
        int ISOLATION_READ_UNCOMMITTED = 1;
        int ISOLATION_READ_COMMITTED = 2;
        int ISOLATION_REPEATABLE_READ = 4;
        int ISOLATION_SERIALIZABLE = 8;
    
        //事物的超时时间,-1代表没有超时时间
        int TIMEOUT_DEFAULT = -1;
    
        int getPropagationBehavior();
    
        int getIsolationLevel();
    
        int getTimeout();
    
        boolean isReadOnly();
    
        String getName();
    }
  • TransactionStatus: トランザクションのステータス

    トランザクションステータス: レコード管理トランザクションプロセス トランザクションステータスのオブジェクト

Spring の 7 種類のトランザクション伝播動作

トランザクション伝播動作は、次の問題を解決するために使用されます。ビジネスメソッド間の相互呼び出し

公式サイトポータル

前提条件:

メソッドB()内でメソッドA()を呼び出す

ネストしたトランザクション

  • PROPAGATION_NESTED: A にトランザクションがあり、トランザクション A は正常に実行されます。トランザクション A の実行が完了したら、セーブ ポイントを設定し、操作 B を実行します。 B が例外をスローした場合は、初期位置にロールバックするか、またはセーブ ポイントにロールバックできます。

    操作がトランザクション内の同じ

PROPAGATION_REQUIRED 内にあることを確認します。メソッド B がメソッド A を呼び出し、メソッド A にトランザクションがある場合、メソッド B は A のトランザクションを使用します。 A にトランザクションがない場合、B はトランザクションを作成します

  • PROPAGATION_SUPPORTS: B が A を呼び出します。A にトランザクションがある場合は、A のトランザクションが使用されます。 A にトランザクションがない場合、B はそのトランザクションを使用しません

  • PROPAGATION_MANDATORY: A にトランザクションがある場合は、A のトランザクションを使用します。A にトランザクションがない場合は、例外がスローされます

  • トランザクション内の操作が同じ

PROPAGATION_REQUIRES_NEW 内にないことを確認します。A にトランザクションが存在します。A トランザクションを一時停止します。 、B の開かれたトランザクションには独自の操作のみが含まれます。 A にはトランザクションが存在せず、B によって作成されたトランザクションには独自の操作のみが含まれています

  • PROPAGATION_NOT_SUPPORTED: A にトランザクションがあり、A は一時停止されており、B はそのトランザクションを使用していません

    *PROPAGATION_NEVER: A にトランザクションがあり、B がスローされる例外

  • Spring は 2 つのトランザクション管理メソッドを提供します

宣言型トランザクション管理: Spring 構成ファイルで宣言的にトランザクションを処理する コードベースのトランザクション処理を置き換えるには (より頻繁に使用されます)

  • トランザクション管理のプログラミング: コードベースのトランザクション処理では、プログラムにコードを記述する必要があります

  • 宣言型トランザクション管理
  • xml に基づく

    <!--配置事务管理器-->
        <bean id="trancationManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
            <property name="dataSource" ref="dataSource" ></property>
        </bean>
    <!--配置事务-->
        <tx:advice id="myAdvice" transaction-manager="trancationManager">
            <tx:attributes>
                <!--配置事务传播和事务隔离-->
                <tx:method name="save*" propagation="REQUIRED" isolation="REPEATABLE_READ"/>
                <tx:method name="update*" propagation="REQUIRED"/>
                <tx:method name="delete*" propagation="REQUIRED"/>
                <tx:method name="find*" read-only="true"/>
                <tx:method name="*" propagation="REQUIRED" />
            </tx:attributes>
        </tx:advice>
        <!--事务是利用aop实现的-->
        <aop:config>
            <aop:pointcut id="ponitcut" expression="execution(* com.amber.xml.service.AccountServiceImpl.transferMoney(..))"></aop:pointcut>
            <aop:advisor advice-ref="myAdvice" pointcut-ref="ponitcut" />
        </aop:config>

    save* は、save で始まるメソッドを示し、PROPATATION_REQUIRED トランザクション伝播を使用し、REPEATABLE_READ トランザクション分離を使用します

    基于注解

    <!--配置事务管理器-->
        <bean id="trancationManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
            <property name="dataSource" ref="dataSource" ></property>
        </bean>
        <!--开启注解事务-->
        <tx:annotation-driven transaction-manager="trancationManager" />

    使用tx:annotation-driven 开启事务的注解后,在使用的时候只需要在类或者方法上加入@Transactional就可以开启注解

    基于xml的事务和基于注解的事务对比

    • 文件配置对比
      事务基于注解简化了xml中的

    • 使用比较
      使用注解必须在类或者方法上添加@Trasactional,如果有多个业务类,则需要在每个业务类上添加
      使用xml只需要在配置文件中配置包名即可

    事务github代码

以上がSpring トランザクション管理の関連概要 (コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。