列宿乃施于上榮兮 日月才經于柍桭

          ………… 白駒過隙 歲月如斯 夢縈回繞 心靈之聲
          posts - 57, comments - 8, trackbacks - 0, articles - 41
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Spring中的事務應用

          Posted on 2010-07-04 15:16 默認為零 閱讀(145) 評論(0)  編輯  收藏 所屬分類: 技術

            Spring中的事務管理有聲明式事務和編碼式事務兩種。
            聲明式事務顧名思義就是采用聲明的方式來處理事務。是指在Spring配置文件中聲明式的處理事務來代替代碼式的處理事務。Spring使用AOP來完成聲明式的事務管理,因而聲明式事務是以方法為單位,而事務管理不侵入開發的組件的一種事務處理方式。
            而編碼式事務顯然就是通過應用開發者的事務相關編碼行為完成事務實現的一種處理方式。
           
          聲明式事務

            首先定義事務代理如下:

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

            key屬性確定代理應該給哪個方法增加事務行為。這樣的屬性最重要的部份是傳播行為。有以下選項可供使用:

            PROPAGATION_REQUIRED--支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。 
            PROPAGATION_SUPPORTS--支持當前事務,如果當前沒有事務,就以非事務方式執行。 
            PROPAGATION_MANDATORY--支持當前事務,如果當前沒有事務,就拋出異常。 
            PROPAGATION_REQUIRES_NEW--新建事務,如果當前存在事務,把當前事務掛起。 
            PROPAGATION_NOT_SUPPORTED--以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。 
            PROPAGATION_NEVER--以非事務方式執行,如果當前存在事務,則拋出異常。


            其次對于事務代理的引用:

          <bean id="userManager" parent="baseTransactionProxy">
            
          <property name="target">
             
          <bean class="com.alibaba.xxx.service.impl.UserManagerImpl">
              
          <property name="userDao" ref="userDao" />
              
          <property name="roleDao" ref="roleDao" />
             
          </bean>
            
          </property>
           
          </bean>

            這樣如果UserManagerImpl實現中如果含有save*、remove*、update*、query*的方法名,Spring會自動應用其相應配置的事務實現。

          編碼式事務

          1、TransactionTemplate的事務處理

          TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
           
          //調用transactionTemplate的execute方法進行事務管理
          Object result = transactionTemplate.execute (
          //回調函數實現了TransactionCallback接口的doInTransaction方法
           new TransactionCallback() {
           
          public Object doInTransaction(TransactionStatus status) {
            
          //數據庫操作代碼
            
          //userDao.xxx();
            
          //roleDao.xxx();
            return resultObject;
           }

          }
          );


          2、JdbcTemplate的事務處理

          DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 
          TransactionStatus status 
          = transactionManager.getTransaction(def); 
          try{
           JdbcTemplate jdbcTemplate 
          = new JdbcTemplate(dataSource); 
           jdbcTemplate.update(
          "insert into tbl_user_info values(xx, xx, xx)"); 
          }
           catch (DataAccessException ex) {
           transactionzManager.rollback(status); 
           
          throw ex;
          }
           finally{
           transactionManager.commit(status); 
          }
            編碼式事務還有其他編寫方式,Spring中單數據源的事務其實就是對JDBC的簡單封裝,其操作方式非常類似JDBC的事務應用。

          主站蜘蛛池模板: 南汇区| 漳平市| 华蓥市| 罗江县| 杭州市| 夏邑县| 三亚市| 承德市| 读书| 高唐县| 丰城市| 双辽市| 读书| 纳雍县| 淮北市| 收藏| 威远县| 抚州市| 汉中市| 长兴县| 焦作市| 榆中县| 辽源市| 威海市| 思茅市| 高雄县| 福清市| 紫金县| 花莲县| 河曲县| 东港市| 政和县| 浦城县| 乌审旗| 伊春市| 南投市| 安塞县| 长沙县| 漳浦县| 延庆县| 习水县|