posts - 156,  comments - 601,  trackbacks - 0

          前言:

          本文章會(huì)通過連載的方式來深入了解和學(xué)習(xí)Spring相關(guān)核心技術(shù)和實(shí)現(xiàn)原理。包括SpringBean生命周期管理,聲明性事務(wù)管理,AOP管理,注解應(yīng)用實(shí)現(xiàn),以及在其上面進(jìn)行擴(kuò)展的相關(guān)應(yīng)用。

          本篇技術(shù)文章將介紹Spring聲明式事務(wù)管理實(shí)現(xiàn)技術(shù)細(xì)節(jié)的剖析。

          首先看一下Spring基于XML方式的聲明式事務(wù)配置方法。(基于注解的也是相同,下篇在介紹Spring注解應(yīng)用擴(kuò)展實(shí)現(xiàn)時(shí),會(huì)再介紹基于注解的Spring聲明式事務(wù)的實(shí)現(xiàn)細(xì)節(jié))

          首先配置 BeanNameAutoProxyCreator 實(shí)現(xiàn)基于Bean 名稱規(guī)則匹配的AOP攔截

          示例代碼如下:



          從上面的配置示例中,可以發(fā)現(xiàn)Spring的聲明式事務(wù)由一個(gè)叫TransactionInterceptor AOP攔截器實(shí)現(xiàn), 我們代碼的整體分析過程也是從這個(gè)類開始

          TransacionInterceptor的類描述如下,其實(shí)現(xiàn)了MethodInterceptor接口


          代碼主體邏輯都是invoke方法里

          下面是invoke方法的主要邏輯說明

          首先獲得攔載的方法名和類名,根據(jù)在xml文件的匹配規(guī)則,找出事務(wù)的配置規(guī)則,創(chuàng)建TransactionAttribute對(duì)象(如事務(wù)的讀寫屬性,傳播屬性,事務(wù)隔離級(jí)別等)

          如果匹配事務(wù)規(guī)則,則調(diào)用 createTransactionIfNecessary方法創(chuàng)建事務(wù)

          整理創(chuàng)建事務(wù)的過程,則會(huì)調(diào)用SpringPlatformTransactionManager的接口實(shí)現(xiàn)類,示例中配置的是HibernateTransactionManager

          整理個(gè)事務(wù)創(chuàng)建過程中,會(huì)用到兩個(gè)重要的對(duì)象,說明如下:

          HibernateTransactionObject 保存事務(wù)狀態(tài)(是否新事務(wù),是否新的SessionHolder,以前對(duì)應(yīng)的SessionHolder實(shí)例) SessionHolder則是用于保持Transaction對(duì)象實(shí)例,以及管理事務(wù)所需要相關(guān)信息如引用次數(shù),是否只能回滾等。

          TransactionSynchronizationManager 管理當(dāng)前線程的事務(wù)運(yùn)行情況,所有的事務(wù)傳播嵌套處理都由它來控制管理,它會(huì)保存以下信息:

                                  當(dāng)前的事務(wù)名稱 currentTransactionName

                                  當(dāng)前只讀事務(wù)的狀態(tài) currentTransactionReadOnly

                                  當(dāng)前事務(wù)使用的隔離級(jí)別 currentTransactionIsolationLevel

                                  當(dāng)前同步控制TransactionSynchronization對(duì)象synchronizations

                                  當(dāng)前的ResourceHolder對(duì)象實(shí)列,保存連接對(duì)象resources

          下面是創(chuàng)建事務(wù)的序列圖


          核心代碼及說明如下:

          在創(chuàng)建事務(wù)過程中,會(huì)檢測(cè)之前有沒有事務(wù)開啟,如果有則會(huì)根據(jù)當(dāng)前方法上設(shè)置的事務(wù)的傳播信息來決定是否使用原來事務(wù),還是掛起原來事務(wù),或開啟新的事務(wù)等。

          AbstractPlatformTransactionManager.getTransaction方法


          是否新開啟事務(wù)最終會(huì)將該狀態(tài)設(shè)置到HibernateTransactionObjectnewSession屬性上。這樣在嵌套的方法退出時(shí),可以由這個(gè)屬性來決定要不要真正的提交事務(wù)。

          封裝創(chuàng)建JDBC的事務(wù)代碼如下:HibernateTransactionManager.doBegin()方法


          事務(wù)的提交和回滾實(shí)現(xiàn)

          事務(wù)提交 TransactionInterceptorcommitTransactionAfterReturning來實(shí)現(xiàn)

          主要代碼如下:AbstractPlatformTransactionManager#commit方法


          事務(wù)回滾TransactionInterceptorcompleteTransactionAfterThrowing來實(shí)現(xiàn)

          主要代碼如下:AbstractPlatformTransactionManager#rollback方法


          基本上Spring的聲明式事務(wù)的基本實(shí)現(xiàn)原理都已經(jīng)介紹完了,下面附上相關(guān)的源碼文件列表:

          TransactionInterceptor.java

          HiberanteTransactionManager.java

          AbstractPlatformTransactionManager.java

          TransactionSynchronizationManager.java

          SessionHolder.java

          ConnectionHolder.java

          TransactionStatus.java



          Good Luck!

          Yours Mattthew!

          posted on 2011-04-29 10:54 x.matthew 閱讀(2186) 評(píng)論(1)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 秀山| 淅川县| 林口县| 临夏县| 佛坪县| 册亨县| 南澳县| 大同县| 纳雍县| 栖霞市| 剑河县| 南郑县| 隆化县| 公主岭市| 洞头县| 开化县| 瑞昌市| 都昌县| 泰顺县| 巴彦淖尔市| 乐至县| 凤山县| 旺苍县| 聊城市| 全椒县| 乌苏市| 西藏| 沈阳市| 荣昌县| 岳西县| 滦南县| 雅江县| 驻马店市| 明溪县| 澄城县| 定远县| 巴南区| 武平县| 六盘水市| 宣城市| 济源市|