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小記 閱讀(1203) 評論(1)  編輯  收藏

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

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


          網站導航:
           

          <2005年11月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 大悟县| 芮城县| 德令哈市| 龙泉市| 镇宁| 太康县| 天水市| 沂水县| 五大连池市| 墨脱县| 宾川县| 乌什县| 普安县| 陕西省| 中西区| 镇沅| 彩票| 肇庆市| 利辛县| 苏尼特右旗| 白朗县| 郓城县| 应用必备| 桑日县| 宁都县| 青海省| 垦利县| 新绛县| 肥西县| 金阳县| 昆山市| 弥渡县| 东乡族自治县| 玉林市| 顺平县| 城步| 鞍山市| 曲周县| 肃宁县| 丰原市| 祁连县|