<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或它的子類,事務將 會自動回滾??梢杂枚禾柗指舳x多個回滾規則。-前綴強制回滾,+前綴指定提 交

    重新運行代碼,成功!!

     

     

    posted on 2008-06-15 14:32 Hank1026 閱讀(207) 評論(0)  編輯  收藏 所屬分類: 每日積累
    主站蜘蛛池模板: 国产偷窥女洗浴在线观看亚洲| 好吊妞788免费视频播放| 久久亚洲国产精品五月天婷| 91在线亚洲综合在线| 成人免费视频69| 亚欧在线精品免费观看一区| 丁香花免费高清视频完整版 | 91短视频免费在线观看| 亚洲人成网站在线播放影院在线| 丁香花在线视频观看免费| 久久久亚洲精品蜜桃臀| GOGOGO高清免费看韩国| 国产一卡2卡3卡4卡2021免费观看| 久久精品国产亚洲AV高清热| 亚洲午夜无码毛片av久久京东热| 亚洲av无码日韩av无码网站冲 | 免费精品人在线二线三线区别| 亚洲字幕在线观看| 亚洲日韩在线观看免费视频| 亚洲精品国产免费| 亚洲日韩VA无码中文字幕 | 国产三级在线观看免费| 亚洲午夜精品一区二区麻豆| 日韩一级视频免费观看| 免费激情网站国产高清第一页| heyzo亚洲精品日韩| 成av免费大片黄在线观看| 亚洲精品亚洲人成在线观看| 日韩插啊免费视频在线观看| 亚洲精品不卡视频| 中国毛片免费观看| 18亚洲男同志videos网站| 亚洲免费网站观看视频| 日本精品久久久久久久久免费| 亚洲精品V欧洲精品V日韩精品| 亚洲精品免费在线观看| 亚洲理论电影在线观看| 国产免费丝袜调教视频| 久久人午夜亚洲精品无码区| 亚洲精品国产精品乱码不99| 69av免费视频|