Spring 事務的兩種方式;編程式和配置式; 編程式事務即用編碼來實現事務,類似於JDBC編程實現事務的管理;
編程式:
根據PlatformTransactionManager、TransactionDefinition 和 TransactionStatus 三個核心接口,我們就可以實現通過編程式進行事務管理;
基於底層 API 的編程式事務管理
1 public class BankServiceImpl implements BankService { 2 private BankDao bankDao; 3 private TransactionDefinition txDefinition; 4 private PlatformTransactionManager txManager; 5 ...... 6 public boolean transfer(Long fromId, Long toId, double amount) { 7 TransactionStatus txStatus = txManager.getTransaction(txDefinition); //獲取事務 8 boolean result = false; 9 try { 10 result = bankDao.transfer(fromId, toId, amount); 11 txManager.commit(txStatus); //提交事務 12 } catch (Exception e) { 13 result = false; 14 txManager.rollback(txStatus); //產生異常,回滾事務 15 System.out.println("Transfer Error!"); 16 } 17 return result; 18 } 19 }
基於底層API的事務管理示例配置文件
<bean id="bankService" class="footmark.spring.core.tx.programmatic.origin.BankServiceImpl"> <property name="bankDao" ref="bankDao"/> <property name="txManager" ref="transactionManager"/> <property name="txDefinition"> <bean class="org.springframework.transaction.support.DefaultTransactionDefinition"> <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"/> </bean> </property> </bean>
如上邊代碼所示,我們在類中增加了兩個屬性;
一個是 TransactionDefinition 類型的屬性,它用於定義一個事務;另一個是 PlatformTransactionManager 類型的屬性,用於執行事務管理操作。
如果方法需要實施事務管理,我們首先需要在方法開始執行前啟動一個事務,調用PlatformTransactionManager.getTransaction(...) 方法便可啟動一個事務。創建並啟動了事務之后,便可以開始編寫業務邏輯代碼,然后在適當的地方執行事務的提交或者回滾。
基於 TransactionTemplate 的編程式事務管理
通過上述代碼我們看到,Spring事務的回滾和提交不是通過connection進行的,因為Spring的事務管理器是面向PlatformTransactionManager接口編程實現事務的控制;
配置式:
Spring的聲明式事務管理是基於AOP的基礎進行的;其本質的實現方法是,在一個方法執行的前后各加上事務,然后在方法執行后,根據方法執行的情況來判斷事務的提交和回滾;聲明式事務最大的優點是不需要通過編程寫代碼 的方式來實現事務,而是通過AOP的切面注入,只需要在配置文件中配置就可以實現事務的管理;這樣就可以在業務邏輯中不摻雜事務管理的代碼,但是聲明式事務也有缺點,就是聲明式事務的粒度只能精確到方法,而編程式事務的粒度可以精確到任意的代碼塊;但是,聲明式事務的粒度,我們可以將需要進行事務管理的代碼抽出作為一個方法,這樣就能夠實現代碼塊級別的事務管理;聲明式事務在開發中不僅僅使用更簡單,更重要的是,使用聲明式事務不會侵入我們的業務邏輯代碼,給代碼的維護提供了便利;