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

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

          日歷

          <2010年7月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          公告

          平凡之人悟非平凡之事,升華之道也。
          本壇實乃雜燴,工作、生活、育兒、健身,指哪打哪,想哪寫哪!

          搜索

          •  

          積分與排名

          • 積分 - 30939
          • 排名 - 1358

          最新評論

          Spring中的事務應用

          Posted on 2010-07-04 15:16 默認為零 閱讀(148) 評論(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的事務應用。

          主站蜘蛛池模板: 江永县| 芮城县| 拜城县| 浏阳市| 壤塘县| 库伦旗| 平潭县| 辉县市| 吴旗县| 开化县| 甘泉县| 图们市| 兴文县| 陕西省| 阜康市| 山东| 如皋市| 涟源市| 资兴市| 田东县| 南充市| 来凤县| 靖江市| 大名县| 万山特区| 麻江县| 桃江县| 进贤县| 诏安县| 云林县| 玛纳斯县| 锦州市| 勐海县| 竹溪县| 澜沧| 新化县| 兰州市| 亳州市| 剑川县| 油尖旺区| 嘉鱼县|