這裡主要是通過分析部分源碼進行剖析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的事務功能:
<tx:annotation-driven transaction-manager="myTxManager" />
再配置檔案中,配置上面的資訊,進可以開啟Spring的事務管理功能。當然這事基于注解事務的。開啟這個,代碼中的Transactional注解才會起作用。
配置上面的資訊後,Spring在初始化包含Transactional注解的類時,會自動生成這些類的代理,并放置再容器中,以便備用。如:
總結:Spring的事務管理的内部實作是利用了代理技術。(這句話不知道是不是多餘, -_- 歡迎吐嘈,拍磚哈)
@Transactional
@Service
public class ProductTypeServiceImpl extends AbstractDao implements ProductTypeService {
public ProductTypeServiceImpl () {
System.out.println("***************************************************");
System.out.println("class ProductTypeServiceImpl initialized");
System.out.println("***************************************************");
}
}
Spring生成的代理類,如圖:
開啟事務:
送出事務:
在applicationContext.xml檔案中,沒有配置 <tx:annotation-driven>标簽時,截圖如下: