Springトランザクション管理の実現方法:プログラミングトランザクションと宣言トランザクション

8179 ワード

本文は本人の別のブログに転載した.http://blog.csdn.net/liaohaojian/article/details/70139151】
1.前の記事ではSpringトランザクションの伝播レベルと独立性レベル、および分散トランザクションの簡単な構成について説明しています.
2.プログラミングトランザクション:コーディング方式でトランザクション管理を実現する(コードプレゼンテーションはJDBCトランザクション管理)
Springはプログラミングトランザクションを実現し,2つのクラスに依存し,それぞれ前述のPlatformTransactionManagerとテンプレートクラスTransactionTemplate(推奨)である.Springがこのクラスでトランザクション管理を実現する方法については、それぞれ詳しく説明します.
1)PlatformTransactionManager,前編では,このクラスが持つ方法について詳しく解説したが,前編を見返すことは覚えていない.
トランザクションマネージャの構成

    
    
    
    
     
     
         5
     
     
     
         30
     
     
     
         10
     
     
     
         60
     
     
     
         5
     
     
     
         0
     
     
     
         60
     
     
     
         30
     
     
     
         true
     
     
     
         false
     



    

ビジネスでコードを使用する(クラスの表示をテストする)
import java.util.Map;
import javax.annotation.Resource;
import javax.sql.DataSource;
import org.apache.log4j.Logger;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4Cla***unner;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
 
@RunWith(SpringJUnit4Cla***unner.class)
@ContextConfiguration(locations = { "classpath:spring-public.xml" })
public class test {
    @Resource
    private PlatformTransactionManager txManager;
    @Resource
    private  DataSource dataSource;
    private static JdbcTemplate jdbcTemplate;
    Logger logger=Logger.getLogger(test.class);
    private static final String INSERT_SQL = "insert into testtranstation(sd) values(?)";
    private static final String COUNT_SQL = "select count(*) from testtranstation";
    @Test
    public void testdelivery(){
        //        ,    ,
        DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 
        def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED); 
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); 
        //     ,  PlatformTransactionManager getTransaction          ;       ,Spring               
        TransactionStatus status = txManager.getTransaction(def); 
        jdbcTemplate = new JdbcTemplate(dataSource);
        int i = jdbcTemplate.queryForInt(COUNT_SQL); 
        System.out.println("      :"+i);
        try { 
            jdbcTemplate.update(INSERT_SQL, "1"); 
            txManager.commit(status);  //  status      
        } catch (RuntimeException e) { 
            txManager.rollback(status);  //  
        } 
        i = jdbcTemplate.queryForInt(COUNT_SQL); 
        System.out.println("      :"+i);
    }
}

2)TransactionTemplateを使用します.このクラスは、トランザクション管理をシンプル化するためのインタフェースD u l t TransactionDefinitionを継承します.トランザクション管理はテンプレートクラスによって定義されます.主にTransactionCallbackコールバックインタフェースまたはTransactionCallbackWithoutResultコールバックインタフェースによって指定されます.テンプレートクラスのパラメータタイプがTransactionCallbackまたはTransactionCallbackWithoutResultのexecuteメソッドを呼び出すことによって、動的享受トランザクション管理が行われます.
TransactionTemplateテンプレートクラスで使用されるコールバックインタフェース:
  • TransactionCallback:このインタフェースの「T doInTransaction(TransactionStatus status)」メソッドを実装することによって、トランザクション管理が必要なオペレーティングコードを定義します.
  • TransactionCallback WithoutResult:TransactionCallbackインタフェースを継承し、「void doInTransactionWithoutResult(TransactionStatus status)」便利なインタフェースを提供し、値を返す必要のないトランザクション・オペレーション・コードを便利にします.

  • テストクラスで実装方法を示します
    @Test
    public void testTransactionTemplate(){
    	jdbcTemplate = new JdbcTemplate(dataSource);
        int i = jdbcTemplate.queryForInt(COUNT_SQL);  
        System.out.println("      :"+i);
    	//       TransactionTemplate
    	TransactionTemplate template = new TransactionTemplate(txManager);
    	template.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);  
    	//  execute        
    	template.execute(new TransactionCallbackWithoutResult() {
    		@Override
    		protected void doInTransactionWithoutResult(TransactionStatus status) {
    			jdbcTemplate.update(INSERT_SQL, "  ");   //  sd int ,           ,    ,  TransactionTemplate      
    		}}
    	);
    	i = jdbcTemplate.queryForInt(COUNT_SQL);  
        System.out.println("      :"+i);
    }

    3.声明式事務:プログラム式事務は毎回単独で実現しなければならないことが分かるが、業務量が多くて機能が複雑な場合、プログラミング式事務を使用するのは間違いなく苦痛であるが、音声式事務は異なり、声明式事務は侵入式がなく、業務ロジックの実現に影響しない.
    宣言型トランザクション実装方式は主に2種類あり、Springの定義トランザクション通知を使用してAOP関連構成を実装するものと、@Transactionalによるトランザクション管理実装を実装するもので、2つの方法の構成方法について詳しく説明します.
    1)方式一、プロファイルは以下の通り
    
    
    	
    	    
    		
    		
    		
    	
    
    
    
        
        
        
    

    トランザクションの伝播動作と独立性レベルについては、を参照してください.http://blog.csdn.net/liaohaojian/article/details/68488150
    注意点:
  • トランザクションロールバック異常はRuntimeException異常のみであり、Checked Exception異常はロールバックせず、キャプチャ異常は投げ出さずロールバックもしないが、トランザクションロールバックを強制することができる:TransactionAspectSupport.currentTransactionStatus().isRollbackOnly();
  • 自己呼び出しによる適切なトランザクション属性の設定ができない問題を解決するには、「」を参照してください.http://www.iteye.com/topic/1122740

  • 2)方式2@Transactionalによるトランザクション管理
       
         
        
     //      

    @Transactional(propagation=Propagation.REQUIRD,isolation=Isolation.READ_COMMITTED)具体的なパラメータは上記と同じです
    Springが提供する@Transaction注記トランザクション管理は、内部でも同様に、内部では、トランザクションのオン/オフをループ通知TransactionInterceptorで実現します.@Transactionalの使用上の注意点:
  • インタフェース、インプリメンテーションクラス、またはメソッドに@Transactional注釈が指定されている場合、優先順位はメソッド>インプリメンテーションクラス>インタフェースである.
  • は、JDKエージェントメカニズム(インタフェースベースのエージェント)を使用する場合は問題ないため、インタフェースで使用するのではなく、クラスまたはクラスを実装する方法でのみ@Transactionalを使用することを推奨する.一方、CGLIBエージェント(継承)メカニズムを使用すると、インタフェースではなくクラスベースのエージェントを使用するため、問題が発生します.これは、インタフェース上の@Transactional注釈が「継承できない」ためです.