feng

          飄逸~~~~~life

          最近學(xué)習(xí)spring聲明式事務(wù)小結(jié)

          在一些需要同時(shí)操作幾個(gè)更新的業(yè)務(wù)邏輯中,而這幾個(gè)更新又是互相關(guān)聯(lián)的,也就是說(shuō)我們希望它成功就一起成功,
          失敗就一起失敗。這樣我們就需要使用事務(wù)。關(guān)于如何配置spring聲明式事務(wù)就不說(shuō)了,需要的人可以在網(wǎng)上找下,
          肯定會(huì)配置一個(gè)類似下面的bean
          <bean id="cao" 

          class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
                   
          <property name="transactionManager">
                      
          <ref bean="transactionManager"/>
                  
          </property>
                  
          <property name="target">
                      
          <ref bean="cao1"/>
                  
          </property>
                  
          <property name="transactionAttributes">
                      
          <props>
                          
          <prop key="insert*">PROPAGATION_REQUIRED</prop>
                          
          <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
                      
          </props>
                  
          </property>
              
          </bean>
          我在程序中使用的是spring的JdbcTemplate
          try{
           JdbcTemplate jdbcTemplate 
          = new JdbcTemplate(dataSource);
                         jdbcTemplate.update(
          "insert into NETFAXNO_TBL

          (NETFAXNO,AREAID,PHONEAREA,CITYCODE,STATUS,lasttime,bnetid) values

          (
          '"+a1+"','"+a2+"','"+a3+"','"+a4+"','"+a5+"',getdate(),'"+a6+"' )");
                         
                         jdbcTemplate.update(
          "insert into NETFAXNO_TBL

          (NETFAXNO,AREAID,PHONEAREA,CITYCODE,STATUS,lasttime,bnetid) values(
          '"+a1+Integer.valueOf("e")

          +"','"+a2+"','"+a3+"','"+a4+"','"+a5+"',getdate(),'"+a6+"' )");

                      a
          =true;
                      
                  }
          catch(Exception e){
                      e.printStackTrace();
                      }
          注意我故意在程序中放了一個(gè)會(huì)報(bào)異常的代碼Integer.valueOf("e")
          測(cè)試結(jié)果是沒有成功,前一句已經(jīng)在數(shù)據(jù)庫(kù)里了。
          后來(lái)修改spring的配置文件
           <props>
                          <prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>
                          <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
                      </props>
          測(cè)試結(jié)果還是沒有成功,前一句已經(jīng)在數(shù)據(jù)庫(kù)里了。
          所以大家以后在使用的時(shí)候就要注意了,正確的方式是在catch中顯式拋出你在配置文件聲明的異常
          將上面的catch修改成為
          catch(Exception e){
             e.printStackTrace();
                                  throw new Exception("回滾");
             }

          這樣就可以回滾上面的更新操作了
          需要注意的是拋出的異常必須跟配置文件中的異常一致,否則不能回滾,或者經(jīng)過(guò)我測(cè)試,也可以
          拋出
          UnsupportedOperationException

          則不需要跟配置文件異常相同,可以正常回滾。

          posted on 2009-03-04 16:11 feng 閱讀(3261) 評(píng)論(0)  編輯  收藏


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 大名县| 长汀县| 内丘县| 彭山县| 泉州市| 原阳县| 南澳县| 梁河县| 中西区| 富民县| 祥云县| 老河口市| 个旧市| 沙洋县| 额尔古纳市| 宁明县| 吴江市| 台东市| 吉水县| 陈巴尔虎旗| 永昌县| 开阳县| 望都县| 陆河县| 丹凤县| 阜平县| 韶山市| 昌黎县| 年辖:市辖区| 濮阳市| 旬阳县| 阿拉尔市| 濉溪县| 登封市| 无棣县| 海口市| 城口县| 遂川县| 依兰县| 侯马市| 江源县|