<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-51  評論-14  文章-0  trackbacks-0
     

    Spring提供了一致的事務管理抽象。這個抽象是Spring最重要的抽象之一, 它有如下的優點:

    1.為不同的事務API提供一致的編程模型,如JTA、JDBC、Hibernate、iBATIS數據庫層 和JDO

    2.提供比大多數事務API更簡單的,易于使用的編程式事務管理API

    3.整合Spring數據訪問抽象

    4.支持Spring聲明式事務管理

    環境:eclipse3.0,JDK1.4,spring1.2.3,mysql

    程序主體代碼如下:

    配置文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "
                <beans>
      <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close">
       <property name="driverClassName">
        <value>com.mysql.jdbc.Driver</value>
       </property>
       <property name="url">
        <value>jdbc:mysql://localhost:3306/test</value>
       </property>
       <property name="username">
        <value>root</value>
       </property>
       <property name="password">
        <value>1234</value>
       </property>
      </bean>
      <bean id="business" class="databaserollback.BusinessImpl">
       <property name="dataSource">
        <ref bean="dataSource"/>
       </property>
      </bean>
     
         <bean id="dbTransactionManager"
         class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
         <property name="dataSource">
         <ref bean="dataSource"/>
        </property>
      </bean>
      
         <bean id="accountservice" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" >
         <property name="transactionManager" ><ref bean="dbTransactionManager" /></property>
         <property name="target">
        <ref bean="business" />
      </property>
         <property name="transactionAttributes" >
          <props>
           <prop key="insertOne">PROPAGATION_REQUIRED</prop>
          </props>
         </property>
        </bean>
     
    </beans>

     

    業務類:

    
                

    public class BusinessImpl implements Business {
       
        DataSource dataSource = null;
        /**
         * @throws SQLException
         *
         */
        public void insertOne() {
            Connection conn = DataSourceUtils.getConnection(dataSource);
            Statement stat;
            try {
                stat = conn.createStatement();
           
            String sql = "insert into room1 (room_id,address) values ('1','dalian')";
            String sql1 = "insert into room1 (room_id,address) values ('1','dalian')";
           
            stat.executeUpdate(sql);
            stat.executeUpdate(sql1);

            } catch (SQLException e) {

            }
           System.out.println("insertOne");
        }
       

        /**
         * @return Returns the ds.
         */
        public DataSource getDataSource() {
            return dataSource;
        }
        /**
         * @param ds The ds to set.
         */
        public void setDataSource(DataSource dataSource) {
            this.dataSource = dataSource;
        }
    }

     

    測試類:

    
                

    public class Test {
      
        protected static PlatformTransactionManager transactionManager;
        protected static TransactionStatus transactionStatus;
        public static void main(String[] args) throws SQLException  {
         ClassPathResource res;
         XmlBeanFactory factory;
      res = new ClassPathResource("Appcontext.xml");
      factory = new XmlBeanFactory(res);
      
            //transactionManager = (PlatformTransactionManager) factory.getBean("dbTransactionManager");
            //transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition());
      
      
      Business bi = (Business) factory.getBean("accountservice");
    //  
    //  try {
                bi.insertOne();

    //        } catch (SQLException e) {
    //            transactionManager.rollback(transactionStatus);
    //        }
        }
    }

     

     

    因為使用的數據庫是mysql,所以建立表的時候要指定INNODB,來支持事務!

    CREATE TABLE room1 (
      ROOM_ID varchar(10),
      ADDRESS varchar(32),
      PRIMARY KEY  (ROOM_ID)
    ) TYPE=INNODB;

    執行這段代碼之后,控制臺拋出錯誤,查詢數據庫,發現事務沒有回滾,為什么呢??

    首先要了解spring處理事務的本質,只有當程序拋出一個RuntimeException-->DataAccessException是spring才會捕獲他,并且進行事務的處理!

    我們將上面的業務類修改一下,使用spring封裝的JDBCTemplate

    JdbcTemplate jt = new JdbcTemplate(dataSource);

            jt.update("insert into room1 (room_id,address) values ('1','dalian')");
            jt.update("insert into room1 (room_id,address) values ('1','dalian')");

    重新運行代碼,發現數據庫成功回滾!但是spring的template雖然很方便,但是對JDBC的支持還是不夠完善,所以很多人還是喜歡用原生的JDBC來操作數據庫,根據spring對事務操作的特點,我們對程序中拋出的SQLException坐一下改造

    
                

    catch (SQLException e) {
                throw new MyUncheckException(e.toString());
    }

     

     

    public class MyUncheckException extends DataAccessException {

        /**
         * @param msg
         */
        public MyUncheckException(String msg) {
            super(msg);
            // TODO Auto-generated constructor stub
        }

    }

     然后修改配置文件

    <prop key="insertOne">PROPAGATION_REQUIRED,-MyUncheckException</prop>

    添加的-MyUncheckException指定如果方法拋出MyUncheckException或它的子類,事務將 會自動回滾。可以用逗號分隔定義多個回滾規則。-前綴強制回滾,+前綴指定提 交

    重新運行代碼,成功!!

     

     

    posted on 2008-06-15 14:32 Hank1026 閱讀(204) 評論(0)  編輯  收藏 所屬分類: 每日積累
    主站蜘蛛池模板: 亚洲片国产一区一级在线观看 | 国产精品白浆在线观看免费| 亚洲成?v人片天堂网无码| 亚洲成电影在线观看青青| 99久久精品免费视频| 亚洲av日韩av激情亚洲| 久久久久久影院久久久久免费精品国产小说| 中文字幕亚洲第一| a级毛片毛片免费观看永久| 亚洲乱码中文字幕久久孕妇黑人| 成年女人A毛片免费视频| 精品亚洲综合在线第一区| 搡女人免费免费视频观看| 亚洲av永久无码精品网站| 91精品国产免费久久国语蜜臀 | 久久爰www免费人成| 在线A亚洲老鸭窝天堂| yellow免费网站| 亚洲日韩精品无码专区网站| 亚洲精品日韩中文字幕久久久| 黄色网址在线免费| 国产成人综合亚洲AV第一页| 亚洲乱人伦精品图片| 9277手机在线视频观看免费| 中文亚洲AV片在线观看不卡| 成在人线av无码免费高潮喷水 | 亚洲精品无码日韩国产不卡av| 四虎免费在线观看| 国产亚洲精品91| 国产午夜亚洲精品午夜鲁丝片| 国产一级片免费看| 亚洲第一页在线播放| 99久久国产热无码精品免费| 亚洲AV无码无限在线观看不卡 | 一色屋成人免费精品网站| 亚洲熟妇无码八V在线播放| 日韩视频在线免费观看| 日韩在线视频线视频免费网站| 亚洲国产AV无码专区亚洲AV| 4399影视免费观看高清直播| 亚洲色偷偷色噜噜狠狠99|