天天看點

【Spring學習35】Spring事務(5):程式設計式事務

Spring提供了對程式設計式事務和聲明式事務的支援,程式設計式事務允許使用者在代碼中精确定義事務的邊界,而聲明式事務(基于AOP)有助于使用者将操作與事務規則進行解耦。簡單地說,程式設計式事務侵入到了業務代碼裡面,但是提供了更加詳細的事務管理;而聲明式事務由于基于AOP,是以既能起到事務管理的作用,又可以不影響業務代碼的具體實作。

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

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則沒有傳回值。

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);// 復原
}