ホームページ  >  記事  >  Java  >  Spring の @Transactional トランザクション ロールバックの例とソース コードの詳細な紹介 (写真)

Spring の @Transactional トランザクション ロールバックの例とソース コードの詳細な紹介 (写真)

黄舟
黄舟オリジナル
2017-03-30 11:00:592114ブラウズ

1. 使用シナリオの例

@Transactional の使用方法を理解する前に、まず @Transactional が何に使用されるかを知る必要があります。以下に例を示します。 たとえば、ある部門に多数のメンバーがあり、それぞれ部門テーブルとメンバー テーブルに保存されている場合、特定の部門を削除する場合、デフォルトで対応するメンバーが削除されるとします。ただし、この状況は実行時に発生する可能性があります。最初に部門を削除してからメンバーを削除します。ただし、部門は正常に削除されますが、メンバーを削除するときに例外が発生します。現時点では、メンバーの削除に失敗した場合、以前に削除された部門も削除が取り消されることを期待しています。このシナリオでは、@Transactional トランザクション ロールバックを使用できます。

2. チェックされた例外とチェックされていない例外

ここでチェックされた例外とチェックされていない例外の概念を誰もが知っている理由は次のとおりです。チェックされていない例外が発生すると、すべてのデータベース操作がロールバックされます。発生した例外がチェックされた例外の場合、データベース操作はデフォルトで送信されます。

チェック例外:

は無効であり、プログラム内で予測できないことを意味します。たとえば、無効なユーザー入力、ファイルが存在しない、ネットワークまたはデータベースのリンク エラーなどです。これらはすべて外部的な理由であり、プログラム内で制御することはできません。

コードで明示的に処理する必要があります。たとえば、try-catch ブロック処理、または呼び出しスタックの上位層に例外をスローするメソッドに throws 記述を追加します。

java.lang.Exceptionから

を継承します(java.lang.RuntimeExceptionを除く)。

未チェック例外:

はプログラム内のエラー、論理エラーを示します。 IllegalArgumentException、NullPointerException、IllegalStateException などの RuntimeException のサブクラスです。

未チェックの例外を処理するためにコード内で明示的にキャッチする必要はありません。

java.lang.RuntimeException から継承します (および java.lang.RuntimeException は java.lang.Exception から継承します)。

以下の例外構造図を見ると、階層をより深く理解できるかもしれません:

3. @Transactional

の使用例 この例では、Spring の @Transactional トランザクション ロールバックの例とソース コードの詳細な紹介 (写真)Eclipse

+Maven を jar 管理としてのみ使用します。 、たとえ理解できなくても、Maven の友人も読むことができます。

3.1、Spring の 設定ファイル

は、まず次のように tx 名前空間を設定する必要があります:

@Transactional に基づくトランザクション管理を使用するには、Spring で次の設定を行う必要があります:

<bean id="appTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <property name="dataSource" ref="dataSource" />
    </bean>

    <tx:annotation-driven proxy-target-class="false" transaction-manager="appTransactionManager" />

博メインの Spring 設定ファイル: Spring の @Transactional トランザクション ロールバックの例とソース コードの詳細な紹介 (写真)




       
     
        
            
               classpath:properties/*.properties
                
            
        
    

    
    
        
        
       
        
            ${jdbc_driverClassName}
        
        
            ${jdbc_url}
        
        
            ${jdbc_username}
        
        
            ${jdbc_password}
        
    

    <bean id="appTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <property name="dataSource" ref="dataSource" />
    </bean>

    <tx:annotation-driven proxy-target-class="false" transaction-manager="appTransactionManager" />

    
    
        
    

    
    
        
          
        
        
    

    
    

3.2. @Transactional を使用し、

にユーザーを追加し、実装クラスのメソッドにアノテーションを追加します

@Transactional(propagation=Propagation.REQUIRED)
public void addUser(User user) {
    userDao.addUser(user);
    String string  = null;
    if(string.equals("")) {
        int i = 0;
    }
}

上記のメソッドで意図的に null ポインタ例外を発生させました。ロールバックするには 3.3. ユニットテスト

クラス

@Test  
public void addUserTest(){  
    User user = new User();
    user.setUserName("luoguohui1");
    user.setUserPassword("luoguohui1");
    userService.addUser(user);
}

を実行すると、挿入できないことがわかりますが、@Transactionalが削除された場合、コードは次のようになりますが、例外が発生しますが、対応するデータは残ります。データベースに追加されました:

3.4 、ソースコードのダウンロード

Spring の @Transactional トランザクション ロールバックの例とソース コードの詳細な紹介 (写真) この記事のプロジェクトは、mybatis エントリ (サンプルチュートリアルとソースコードを含む) に基づいて修正されています。この記事には、データベーススクリプトとソースコードの詳細なプロセスが含まれています。プロジェクトの構築。

4. Spring の @Transactional について理解する必要がある概念 Spring の @Transactional は、動的プロキシ メカニズムに基づいており、開発中に発生した問題を迅速かつ簡単に解決するための透過的なトランザクション管理メカニズムを提供します。

一般的な使用法は、次のコードを通じてメソッド、インターフェース、またはクラスに注釈を付けることです:

@Transactional(propagation=Propagation.NOT_SUPPORTED)

伝播は 7 つの異なる伝播メカニズムをサポートします:

必須: トランザクションが存在する場合、現在のトランザクションがサポートされます。トランザクションがない場合は、新しいトランザクションを開始します。

サポート: トランザクションが存在する場合は、現在のトランザクションをサポートします。トランザクションがない場合は、非トランザクション実行。ただし、トランザクション同期を使用するトランザクション マネージャーの場合、PROPAGATION_SUPPORTS はトランザクションを使用しない場合とは若干異なります。 NOT_SUPPORTED: 常に非トランザクションで実行し、既存のトランザクションを一時停止します。

REQUIRESNEW: 常に新しいトランザクションを開始します。トランザクションがすでに存在する場合、既存のトランザクションは一時停止されます。

必須: トランザクションがすでに存在する場合、現在のトランザクションがサポートされます。アクティブなトランザクションがない場合、

例外をスローします

NEVER: 常に非トランザクションで実行し、アクティブなトランザクションが存在する場合は例外をスローします。

NESTED: アクティブなトランザクションが存在する場合は、ネストされたトランザクションで実行します。アクティブなトランザクションがない場合は、REQUIREDプロパティに従って実行します。

以下は注意する必要があるいくつかの事項です。必ず読んでください。そうしないと、さまざまな落とし穴に遭遇することになります。ブロガーがあなたに思い出させなかったとは言わないでください:

以下はあなたが必要とするいくつかの事項です注意するには、必ず読んでください。そうでない場合、さまざまな落とし穴に遭遇しても、ブロガーがあなたに思い出させなかったとは言わないでください。そうしないと、さまざまな落とし穴に遭遇した場合でも、ブロガーが通知しなかったとは言わないでください。

トランザクション管理が必要な場所に @Transactional アノテーションを追加します。 @Transactional アノテーションは、インターフェイス定義とインターフェイス メソッド、クラス定義、クラスのパブリック メソッドに適用できます。

以上がSpring の @Transactional トランザクション ロールバックの例とソース コードの詳細な紹介 (写真)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。