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 小秦 閱讀(229) 評論(0)  編輯  收藏


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


          網站導航:
           
          主站蜘蛛池模板: 游戏| 山阴县| 全州县| 辉南县| 靖安县| 怀仁县| 交城县| 郴州市| 舒城县| 定安县| 嘉善县| 兴海县| 乌兰浩特市| 金堂县| 喀喇| 体育| 阿鲁科尔沁旗| 巴青县| 保德县| 长白| 蓬溪县| 绵阳市| 建始县| 绍兴县| 玉屏| 共和县| 玉山县| 休宁县| 师宗县| 灵宝市| 南涧| 合川市| 邯郸县| 荆州市| 兴化市| 祁东县| 宁强县| 财经| 朝阳县| 克什克腾旗| 从化市|