空間站

          北極心空

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks
          事務管理最佳實踐多余的話之二
          Transaction 后綴給聲明式事務管理帶來的好處
          ?
          前言
          ?
          Transaction后綴給聲明式事務管理帶來的好處
          這樣,可以提醒接口的實現者和方法的使用者注意到它們對于數據庫連接和事務的依賴。
          實際上,使用*Transaction后綴這樣的命名方式,對于聲明式事務管理也是很有用處的。如,Spring的事務管理中,我們一般使用方法名的匹配來應用聲明式事務。
          一、請看下面的Spring配置:

          <bean?id="txProxyTemplate"?abstract="true"?class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
          ???????
          <property?name="transactionManager"?ref="transactionManager"/>
          ???????
          <property?name="transactionAttributes">
          ???????????
          <props>
          ??????????????
          <prop?key="*">readOnly</prop>
          ??????????????
          <prop?key="add*">PROPAGATION_REQUIRED,-Exception</prop>
          ??????????????
          <prop?key="save*">PROPAGATION_REQUIRED,-Exception</prop>
          ??????????????
          <prop?key="modify*">PROPAGATION_REQUIRED,-Exception</prop>
          ??????????????
          <prop?key="update*">PROPAGATION_REQUIRED,-Exception</prop>
          ??????????????
          <prop?key="delete*">PROPAGATION_REQUIRED,-Exception</prop>
          ??????????????
          <prop?key="remove*">PROPAGATION_REQUIRED,-Exception</prop>
          ??????????????
          <prop?key="query*">PROPAGATION_REQUIRED,?readOnly,-Exception</prop>
          ??????????????
          <prop?key="load*">PROPAGATION_REQUIRED,?-Exception</prop>
          ???????????
          </props>
          ???????
          </property>
          ????
          </bean>


          這是來自于真實項目中的Spring聲明式事務配置。我們對每一個業務層的實現類都應用了這樣的事務配置。
          我們對所有業務服務Service方法使用了只讀事務。對以add,save,modify,update,delete,remove,load開頭的方法都使用了事務。
          但是,實際上,雖然我們開發的軟件一個“信息管理系統”,是圍繞數據庫開發的。但是,在Service層,我們還是有很多不操作數據庫的方法。
          如,單純根據業務邏輯進行計算的,適用緩存進行計算的,執行email發送,文件上傳等等任務的方法,在這種配置下都不分青紅皂白的應用了事務。
          SpringAOP生成的代理對象代理了我們的服務實現類,所有的方法執行前后都被攔截,用來得到和關閉數據庫連接,設置、提交和回滾事務。而不管這個方法是否用到了這個數據庫。
          如果遵照我提出的這個方法,使用*Transaction后綴來標識需要處理事務的方法,那么我們使用Spring聲明式事務時,就可以非常精確、有效的應用事務了!
          二、請看下面的Spring事務配置:

          <!--?UninstallWcmsJbpmProcessDefinition?-->
          ????
          <bean?id="uninstallWcmsJbpmProcessDefinition"?parent="txProxyTemplate">
          ?????????
          <property?name="target">
          ???????????
          <ref?bean="uninstallWcmsJbpmProcessDefinitionTarget"/>
          ???????
          </property>
          ???????
          <property?name="transactionAttributes">
          ???????????
          <props>
          ??????????????
          <prop?key="uninstall*Wcms*Transaction">PROPAGATION_REQUIRED,-Exception</prop>
          ???????????
          </props>
          ???????
          </property>
          ????
          ????
          </bean>


          我們對這個類中以uninstall開頭,中間包含Wcms,最后以Transaction結尾,這樣的規則命名的方法,應用了事務。
          三、部分源代碼:
          (一)2個應用了Spring聲明式事務的方法:

          /**
          ?????*使用SPring的ibatis,主要要配置iBatis的Spring聲明式事務。
          ?????*@throwsException
          ?????*<prop?key="uninstall*Wcms*Transaction">PROPAGATION_REQUIRED,-Exception</prop>
          ?????*1,還要刪除所有?頻道---新聞--工作流表中標記不為1的記錄。
          ?????
          */
          ????publicvoid?uninstallAllWcmsProcessDefinitionsTransaction()?
          throws ?Exception{
          ???????
          /**
          ????????*
          ????????*
          ????????
          */
          ???????
          this .getWcmsSystemChannelProcessdefinitionDao().deleteAll();
          ????????
          this .getWcmsSystemChannelNewsinfoDao().deleteAllProcessingWcmsSystemChannelNewsinfoModule();
          ????????
          ????????
          ???????
          ???????
          ????}
          ????
          /**
          ?????*<prop?key="uninstall*Wcms*Transaction">PROPAGATION_REQUIRED,-Exception</prop>
          ?????*@paramname
          ?????*@throwsException
          ?????
          */
          ????publicvoid?uninstallWcmsSystemChannelProcessdefinitionTransaction(String?name)?
          throws ?Exception{
          ???????
          ???????
          this .getWcmsSystemChannelProcessdefinitionDao().deleteByProcessdefinitionName(name);
          ????????
          this .getWcmsSystemChannelNewsinfoDao().deleteAllProcessingWcmsSystemChannelNewsinfoModuleByProcessdefinitionName(name);
          ???????
          ????}
          ?
          (二)用到的Dao類,用來實際訪問數據庫的2個DAO對象。
          /**
          ?????*SPring管理的ibatis功能
          ?????
          */
          private ?IWcmsSystemChannelProcessdefinitionDao?wcmsSystemChannelProcessdefinitionDao;
          ????
          private ?IWcmsSystemChannelNewsinfoDao?wcmsSystemChannelNewsinfoDao;
          ?

          Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1419332

          posted on 2006-12-02 17:13 蘆葦 閱讀(236) 評論(0)  編輯  收藏 所屬分類: Spring
          主站蜘蛛池模板: 南京市| 蒙城县| 常宁市| 波密县| 高平市| 睢宁县| 开江县| 天祝| 青海省| 白城市| 金湖县| 乌审旗| 马鞍山市| 蓝山县| 防城港市| 仁布县| 临夏市| 潢川县| 娄底市| 阿坝| 津南区| 昭通市| 方正县| 札达县| 五河县| 平乐县| 克什克腾旗| 宜黄县| 正阳县| 静安区| 武山县| 武陟县| 油尖旺区| 九寨沟县| 崇礼县| 伊金霍洛旗| 康马县| 广河县| 偏关县| 梁山县| 姜堰市|