Spring、Hibernate 事務流程分析-Session生命周期


                            SpringHibernate 事務流程分析-Session生命周期

TransactionInterceptor(Spring事務架構的具體使用場景) -> invoke方法:

方法意圖大致為獲取當前方面的事務屬性,然后調用父類TransactionAspectSupport的createTransactionIfNecessary()方法去獲取事務(根據需要創建事務)。

TransactionAspectSupport -> createTransactionIfNecessary方法:

 

到PlatformTransactionManager中獲取當前事務狀態對象。而這里講的是HibernateTransactionManager,而AbstractPlatformTransactionManager又是所有事務管理類的基類(如: HibernateTransactionManager)。

AbstractPlatformTransactionManager -> getTransaction方法

 

事務在第一次並且傳播屬性是上面那些屬性時,會調用newTransactionStatus方法創建TransactionStatus。

AbstractPlatformTransactionManager -> newTransactionStatus方法:

 

在newTransactionStatus方法中,會初始化TransactionSynchronzationManager屬性(這對后面的獲取session很有幫助),並創建DefaultTransactionStatus返回。

 

上面大概為一個Spring托管的事務的初始化流程。

下面看HibernateDaoSupport流程。

在HibernateDaoSupport中,不管是getSession()方法還是通過hibernateTemplate.execute(HibernateCallback)最終都會調用SessionFactoryUtils.getSession()。

HibernateDaoSupport -> getSession方法:

 

getSession() 會使用HibernateTemplate的allowCreate屬性,而HibernateTemplate的allowCreate默認是true。 所以會調用后面的SessionFactoryUtils.getSession()方法。

HibernateTemplate -> getSession方法:

 

 

可看到HibernateTemplate最終默認也會調用SessionFactoryUtils.getSession()方法。

SessionFactoryUtils -> getSession方法:

getSession會調用內部的doGetSession()方法:

 

 

 

由於前面講到的事務初始化過程中, 容器會將TransactionSynchronizationManager.isSynchronizationActive()變成true。所以在Spring管理事務的情況下, Spring會自動將Session綁定到事務資源管理器上(TransactionSynchronizationManager類)。而我們知道事務資源管理器內部使用了ThreadLocal類,這樣即實現了線程安全的一次請求一次Session的管理方式。

 

 再次回到TransactionInterceptor類

 

 

這里我們可追蹤complateTransactionAfterThrowing和commitTransactionAfterReturning方法,會發現這2個方法最終都會調用AbstractPlatformTransactionManager. doCleanupAfterCompletion方法去完成清理工作。進入HibernateTransactionManager的對應方法(因為它重寫了父類doCleanupAfterCompletion方法)。

HibernateTransactionManager -> doCleanupAfterCompletion方法:

 

 

可看到在此方法中, 會將綁定在資源管理器上的資源全解綁。 然后將session關閉。

 

至此,Spring托管的事務管理並且使用了HibernateDaoSupport或者HibernateTemplate的應用場景中,Session的完整生命周期介紹完畢。


免責聲明!

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



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