java技術研究

          統計

          留言簿(3)

          閱讀排行榜

          評論排行榜

          Spring事務控制之Hibernate(轉)

          眾所周知,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
          轉自:

          http://www.2cto.com/kf/201207/142772.html

          posted on 2013-06-06 12:57 小秦 閱讀(234) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 冀州市| 芜湖县| 改则县| 昭觉县| 北京市| 全州县| 耿马| 黄冈市| 迭部县| 贵德县| 赤城县| 台州市| 蒙山县| 中江县| 贞丰县| 聊城市| 宝丰县| 胶州市| 泽州县| 镇沅| 广东省| 象山县| 洛扎县| 个旧市| 茂名市| 旅游| 西和县| 含山县| 黄陵县| 古田县| 通州区| 增城市| 金昌市| 开原市| 曲松县| 甘肃省| 五家渠市| 长沙县| 平塘县| 雅安市| 塘沽区|