Spring 是如何控制事務的?


 

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的切面注入,只需要在配置文件中配置就可以實現事務的管理;這樣就可以在業務邏輯中不摻雜事務管理的代碼,但是聲明式事務也有缺點,就是聲明式事務的粒度只能精確到方法,而編程式事務的粒度可以精確到任意的代碼塊;但是,聲明式事務的粒度,我們可以將需要進行事務管理的代碼抽出作為一個方法,這樣就能夠實現代碼塊級別的事務管理;聲明式事務在開發中不僅僅使用更簡單,更重要的是,使用聲明式事務不會侵入我們的業務邏輯代碼,給代碼的維護提供了便利;

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM