Spring源碼解析(一) Spring事務控制之Hibernate – JAVA編程語言程序開發技術文章

 

眾所周知,Spring的事務控制是基於AOP來實現的,一個聲明瞭事務管理的方法(如某個Service的方法)在執行時會被攔截,攔截時執行的“附加”操作集中在:
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(MethodInvocation)
作為一個環繞切面,該方法主要負責在目標方法執行前開始一個事務,在方法執行結束後提交事務。

 

我們先來深入瞭解一下事務是如何創建的。從方法createTransactionIfNecessary()上可以看到,創建事務的主要方法是:

org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(TransactionDefinition)

作為抽象類的方法,getTransaction()隻處理瞭一些通用性的檢查和設置,實質性的創建事務和開啟事務操作都是通過分別調用抽象方法:

org.springframework.transaction.support.AbstractPlatformTransactionManager.doGetTransaction()

org.springframework.transaction.support.AbstractPlatformTransactionManager.doBegin(Object,TransactionDefinition)

來完成的,也就是說這些關鍵性的工作必須由各具體事務管理器來實現,對於hibernate的事務管理器來說,獲取事務對象的方法如下:

 

開始事務的方法如下:

 

以上是關於事務開始部分的代碼,下面我們來看一下事務提交時的代碼:
同樣的,從方法commitTransactionAfterReturning()我們可以看出執行事務提交的方法主要通過回調
org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(DefaultTransactionStatus)
來實現的。

 

補充:
關於方法
org.springframework.transaction.support.TransactionSynchronizationManager.getResource(Object key)
如該方法的註釋所說,它主要是通過給定的key找到對應的資源,特別之處是這些資源實例是綁定在線程上的,也就是spring保證一個線程上一個key對應一個資源實例,不同的線程上綁定的是不同的資源實例。對應到Hibernate上來說,key是sessionFactory,資源是sessionHolder!
作者:bluishglc

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *