Spring編程式和聲明式事務

1.編程式事務

1.1 編程式和聲明式事務的區別

Spring提供了對編程式事務和聲明式事務的支持,編程式事務容許用戶在代碼中精肯定義事務的邊界,而聲明式事務(基於AOP)有助於用戶將操做與事務規則進行解耦。 
簡單地說,編程式事務侵入到了業務代碼裏面,可是提供了更加詳細的事務管理;而聲明式事務因爲基於AOP,因此既能起到事務管理的做用,又能夠不影響業務代碼的具體實現。java

1.2 如何實現編程式事務?

Spring提供兩種方式的編程式事務管理,分別是:使用TransactionTemplate和直接使用PlatformTransactionManager。spring

1.2.1 使用TransactionTemplate

採用TransactionTemplate和採用其餘Spring模板,如JdbcTempalte和HibernateTemplate是同樣的方法。它使用回調方法,把應用程序從處理取得和釋放資源中解脫出來。如同其餘模板,TransactionTemplate是線程安全的。代碼片斷:數據庫

TransactionTemplate tt = new TransactionTemplate(); // 新建一個TransactionTemplate
    Object result = tt.execute(
        new TransactionCallback(){  
            public Object doTransaction(TransactionStatus status){  
                updateOperation();  
                return resultOfUpdateOperation();  
            }  
    }); // 執行execute方法進行事務管理

使用TransactionCallback()能夠返回一個值。若是使用TransactionCallbackWithoutResult則沒有返回值。編程

1.2.2 使用PlatformTransactionManager

示例代碼以下:安全

//定義一個某個框架平臺的TransactionManager,如JDBC、Hibernate
    DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(); 
    // 設置數據源
    dataSourceTransactionManager.setDataSource(this.getJdbcTemplate().getDataSource());
    // 定義事務屬性 
    DefaultTransactionDefinition transDef = new DefaultTransactionDefinition();
    // 設置傳播行爲屬性 
    transDef.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRED);
    // 得到事務狀態 
    TransactionStatus status = dataSourceTransactionManager.getTransaction(transDef); 
    try {
        // 數據庫操做
        dataSourceTransactionManager.commit(status);// 提交
    } catch (Exception e) {
        dataSourceTransactionManager.rollback(status);// 回滾
    }

2.聲明式事務

Spring配置文件中關於事務配置老是由三個組成部分,分別是DataSource、TransactionManager和代理機制這三部分,不管哪一種配置方式,通常變化的只是代理機制這部分。框架

DataSource、TransactionManager這兩部分只是會根據數據訪問方式有所變化,好比使用Hibernate進行數據訪問時,DataSource實際爲SessionFactory,TransactionManager的實現爲HibernateTransactionManager。this

2.1 配置方式

根據代理機制的不一樣,總結了五種Spring事務的配置方式:spa

(1)每一個Bean都有一個代理線程

(2)全部Bean共享一個代理基類代理

(3)使用攔截器

(4)使用tx標籤配置的攔截器

(5)全註解

<!-- 定義事務 -->
	<bean id="transactionManager" 
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>
相關文章
相關標籤/搜索