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

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

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

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

          3.整合Spring數(shù)據(jù)訪問抽象

          4.支持Spring聲明式事務(wù)管理

          環(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è)務(wù)類:

          
                      

          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);
          //        }
              }
          }

           

           

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

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

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

          首先要了解spring處理事務(wù)的本質(zhì),只有當(dāng)程序拋出一個RuntimeException-->DataAccessException是spring才會捕獲他,并且進(jìn)行事務(wù)的處理!

          我們將上面的業(yè)務(wù)類修改一下,使用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ā)現(xiàn)數(shù)據(jù)庫成功回滾!但是spring的template雖然很方便,但是對JDBC的支持還是不夠完善,所以很多人還是喜歡用原生的JDBC來操作數(shù)據(jù)庫,根據(jù)spring對事務(wù)操作的特點,我們對程序中拋出的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或它的子類,事務(wù)將 會自動回滾。可以用逗號分隔定義多個回滾規(guī)則。-前綴強制回滾,+前綴指定提 交

          重新運行代碼,成功!!

           

           

          posted on 2008-06-15 14:32 Hank1026 閱讀(207) 評論(0)  編輯  收藏 所屬分類: 每日積累
          主站蜘蛛池模板: 翁牛特旗| 万载县| 墨脱县| 龙川县| 甘肃省| 衡水市| 尼木县| 龙州县| 房产| 东安县| 广西| 沂水县| 西盟| 中牟县| 瑞安市| 山东省| 贵州省| 苏州市| 长兴县| 额尔古纳市| 兰西县| 浙江省| 泰顺县| 衡水市| 景洪市| 都兰县| 黔江区| 江西省| 报价| 都匀市| 通河县| 旬邑县| 高唐县| 汤原县| 钟山县| 镇巴县| 东港市| 徐闻县| 宝鸡市| 基隆市| 库伦旗|