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