posts - 35,  comments - 7,  trackbacks - 0


          事務不應該由dao管理,而應該由service管理

          最重要的是如下四個類
          DataSource :數據庫的Connection連接工廠
          DataSourceUtils:
          參與同一個事務的多個dao實際上應該是共享同一個conn的。
          DataSourceUtils.getConnection(dataSource)取得當前ThreadLocal的conn,如果沒有從dataSource創建一個。
          DataSourceUtils.releaseConnection(conn, dataSource)未必真正關閉連接。
          DataSourceTransactionManager
          TransactionProxyFactoryBean;攔截具體業務對象方法調用,中間根據DataSourceTransactionManager設置進行事務管理

          文筆不行,說不明白,舉個例子:

           dao1{
             method(){
               conn= DataSourceUtils.getConnection(dataSource);
                ...........
               DataSourceUtils.releaseConnection(conn, dataSource);
             }
           }
           
           dao2{
             method(){
               conn= DataSourceUtils.getConnection(dataSource);
                ...........
               DataSourceUtils.releaseConnection(conn, dataSource);
             }
           }
           
           service{   method();  }
           
           serviceImp{
             method(){
                dao1.method();
                dao2.method();
             }
           }
           
           
           <bean id="dataSource"
                 class="org.apache.commons.dbcp.BasicDataSource"
                 destroy-method="close">
           </bean>     
           <bean id="transactionManager"
                 class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
               <property name="dataSource">
                     <ref local="dataSource" />
               </property>
            </bean> 
            <bean id="service"
                    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
                 <property name="transactionManager">
                    <ref bean="transactionManager" />
                 </property>
                 <property name="target">
                    <ref local="serviceImp" />
                 </property>
                 <property name="transactionAttributes">
                    <props>
                      <prop key="*">PROPAGATION_REQUIRED</prop>
                    </props>
                 </property>
            </bean> 

          分析:
          當調用service.method()時,開始TransactionProxyFactoryBean攔截此方法指定當前線程需要事務,然后調用dao1.method(),
          調用conn= DataSourceUtils.getConnection(dataSource)
          判斷當前線程還沒有conn則創建一個,因為此時線程需要事務所以conn.setAutoCommit(false),執行數據庫作,
          然后DataSourceUtils.releaseConnection(conn, dataSource),判斷當前線程需要事務所以不真正關閉連接繼續,dao1.method()返回。
          調用dao2.method(),調用conn= DataSourceUtils.getConnection(dataSource)判斷當前線程有一個conn就返回這個conn,(此時dao1.method()和dao2.method()已經共用了這個conn),執行數據庫操作,然后DataSourceUtils.releaseConnection(conn, dataSource),判斷當前線程需要事務
          所以不真正關閉連接繼續,dao2.method()返回。service.method()返回,TransactionProxyFactoryBean攔截取得當前線程連接提交事務,關閉清除連接。這樣兩個dao就參與到了一個事務當中。如果service.method()拋出異常,則TransactionProxyFactoryBean在service.method()返回時攔截取得當前線程連接回滾事務,關閉清除連接。

          不知道猜得對不對

          posted on 2005-11-26 11:13 java小記 閱讀(1201) 評論(1)  編輯  收藏

          FeedBack:
          # re: 關于spring的事務管理(單數據庫):純屬猜測。
          2008-12-07 19:57 | 桂豐大廈
          cx  回復  更多評論
            

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


          網站導航:
           

          <2008年12月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 三门峡市| 习水县| 灵丘县| 信丰县| 米易县| 宁明县| 崇文区| 鹤山市| 兰考县| 黎川县| 抚宁县| 乐陵市| 道真| 句容市| 都匀市| 维西| 新巴尔虎左旗| 应用必备| 东乌珠穆沁旗| 利辛县| 武鸣县| 嘉峪关市| 准格尔旗| 佛学| 河曲县| 武胜县| 普定县| 博湖县| 甘谷县| 石泉县| 石首市| 崇义县| 丽江市| 宾川县| 无棣县| 牙克石市| 易门县| 辽中县| 休宁县| 吴川市| 佛坪县|