<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最重要的抽象之一, 它有如下的優(yōu)點:

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

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

    3.整合Spring數據訪問抽象

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

    環(huán)境: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>

     

    業(yè)務類:

    
                

    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;

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

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

    我們將上面的業(yè)務類修改一下,使用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')");

    重新運行代碼,發(fā)現數據庫成功回滾!但是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或它的子類,事務將 會自動回滾。可以用逗號分隔定義多個回滾規(guī)則。-前綴強制回滾,+前綴指定提 交

    重新運行代碼,成功!!

     

     

    posted on 2008-06-15 14:32 Hank1026 閱讀(207) 評論(0)  編輯  收藏 所屬分類: 每日積累
    主站蜘蛛池模板: 日韩a在线观看免费观看| 亚洲另类自拍丝袜第五页| 亚洲AV无码成H人在线观看| 麻豆高清免费国产一区| 久久久久国色AV免费观看| 亚洲av最新在线观看网址| 亚洲网址在线观看| 国产成人亚洲综合无码精品 | 亚洲成a人片在线观看无码专区| 特级淫片国产免费高清视频| 亚欧色视频在线观看免费| 韩国免费A级毛片久久| 99免费在线观看视频| 精品乱子伦一区二区三区高清免费播放| 日本亚洲免费无线码| 亚洲成A∨人片在线观看无码| 亚洲大尺度无码无码专区| 亚洲日韩精品无码一区二区三区 | 色网站在线免费观看| 亚洲国产美女精品久久久| 亚洲人精品亚洲人成在线| 亚洲麻豆精品果冻传媒| 亚洲最大福利视频网站| 大学生高清一级毛片免费| ssswww日本免费网站片| 亚洲视频在线观看地址| 亚洲日本精品一区二区| 亚洲午夜精品久久久久久人妖| 日韩亚洲人成在线综合日本| 亚洲国产日韩在线视频| 国产精品亚洲片在线观看不卡| 亚洲区小说区图片区QVOD| 国产精品亚洲а∨无码播放| 亚洲男同帅GAY片在线观看| 亚洲国产精品va在线播放| 久久精品国产亚洲一区二区| 亚洲av综合av一区| 亚洲精品高清视频| 亚洲福利视频一区二区三区| 亚洲日韩乱码久久久久久| 亚洲最大的成人网|