Spring提供了對編程式事務和聲明式事務的支持,編程式事務容許用戶在代碼中精肯定義事務的邊界,而聲明式事務(基於AOP)有助於用戶將操做與事務規則進行解耦。
簡單地說,編程式事務侵入到了業務代碼裏面,可是提供了更加詳細的事務管理;而聲明式事務因爲基於AOP,因此既能起到事務管理的做用,又能夠不影響業務代碼的具體實現。java
Spring提供兩種方式的編程式事務管理,分別是:使用TransactionTemplate和直接使用PlatformTransactionManager。spring
採用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則沒有返回值。編程
示例代碼以下:安全
//定義一個某個框架平臺的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);// 回滾 }
Spring配置文件中關於事務配置老是由三個組成部分,分別是DataSource、TransactionManager和代理機制這三部分,不管哪一種配置方式,通常變化的只是代理機制這部分。框架
DataSource、TransactionManager這兩部分只是會根據數據訪問方式有所變化,好比使用Hibernate進行數據訪問時,DataSource實際爲SessionFactory,TransactionManager的實現爲HibernateTransactionManager。this
根據代理機制的不一樣,總結了五種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>