1. 程式人生 > >Spring的事務管理實現原理初探

Spring的事務管理實現原理初探

這裡主要是通過分析部分原始碼進行剖析Spring事務管理的實現原理。

再分析原始碼前,現從理論上大概分析哈:

純JDBC操作資料庫的基本步驟:

1. 獲取連線 Connection conn = DriverManager.getConnection()

2. 開啟事務conn.setAutoCommit(true/false);

3. 執行CRUD

4. 提交事務/回滾事務 conn.commit()  /  conn.rollback();

5. 關閉連線 conn.close();

使用Spring的事務管理功能後,我們可以不再寫步驟 2 和 3 的程式碼,而是由Spirng 自動完成。

那麼Spring是如何在我們書寫的 CRUD 之前和之後開啟事務和關閉事務的呢?解決這個問題,也就可以從整體上理解Spring的事務管理實現原理了。

學過Java代理的就可能立馬知道是怎麼回事了,所以這裡就不再贅述Java代理知識了。

這裡具體集合Spring進行分析哈:

1. 在applicationContext.xml檔案中開啟Spring的事務功能:

[html] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. <tx:annotation-driventransaction-manager="myTxManager"/>
再配置檔案中,配置上面的資訊,進可以開啟Spring的事務管理功能。當然這事基於註解事務的。開啟這個,程式碼中的Transactional註解才會起作用。

配置上面的資訊後,Spring在初始化包含Transactional註解的類時,會自動生成這些類的代理,並放置再容器中,以便備用。如:

總結:Spring的事務管理的內部實現是利用了代理技術。(這句話不知道是不是多餘, -_-   歡迎吐嘈,拍磚哈)

[java] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. @Transactional
  2. @Service
  3. publicclass ProductTypeServiceImpl extends AbstractDao implements ProductTypeService {  
  4.     public ProductTypeServiceImpl () {  
  5.         System.out.println("***************************************************");  
  6.         System.out.println("class ProductTypeServiceImpl initialized");  
  7.         System.out.println("***************************************************");  
  8.     }  
  9. }  

Spring生成的代理類,如圖:


開啟事務:

提交事務:

在applicationContext.xml檔案中,沒有配置 <tx:annotation-driven>標籤時,截圖如下:

http://blog.csdn.net/wilsonpeng3/article/details/18464699