在JAVA中,Connection这个类可以使用事务。但没有TransactionBegin之类的开始方法。
我找到一个setSavepiont的,估计是可以设置开始点的。(因为J2EE是英文版的帮助,看不太明白)。于是就试着写下面代码:String sql1="insert into Tb1 values (x1,x2,x3)";
String sql2="insert into Tb2 values (y1,x2,x3)";
Connection con=db.getConnection(); //db是我写的链接数据库的单例的实例。
try{
Savepoint sp=con.setSavepiont();
int a=db.executeUpdate(sql1); //executeUpdate是更新数据库的方法
int b=db.executeUpdate(sql2);
if (a>0&&b>0)
con.commit();
db.close()
}catch(Exception e){
try{
con.rollback();
}catch(Exception e1){
e1.printSatetrace();
}
}运行的时候总是说什么抽象方法错误,是关于savepoint的。
实在不知道怎么搞下去了,请各位高人指教指教。
谢谢!

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【siu5】截止到2008-08-03 22:49:05的历史汇总数据(不包括此帖):
    发帖的总数量:32                       发帖的总分数:625                      每贴平均分数:19                       
    回帖的总数量:43                       得分贴总数量:2                        回帖的得分率:4%                       
    结贴的总数量:32                       结贴的总分数:625                      
    无满意结贴数:10                       无满意结贴分:410                      
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:31.25 %               无满意结分率:65.60 %                  
    敬礼!

    取消马甲机器人,请点这里:http://www.java2000.net/mycsdn/robotStop.jsp?usern=siu5
      

  2.   

    Connection conn = null;
    int a=0;
    int b=0;
     try
            {
        conn = getCon();
        conn.setAutoCommit(false);
        java.sql.Statement stmt = conn.createStatement();
        a = stmt.executeUpdate(sql);
        b = stmt.executeUpdate(str);
                conn.commit();
                conn.setAutoCommit(true);
            } 
            catch (SQLException e)
            {
              try {
    conn.rollback();
    System.out.println("rollback");
    conn.setAutoCommit(true);
    //            e.printStackTrace();
    } catch (Exception e2) {

    // TODO: handle exception
    }
                
            }
           
            finally
            {
            
              if(a<=0||b<=0)
              {
                try {
      conn.rollback();
      System.out.println("rollback");
      conn.setAutoCommit(true);
      //            e.printStackTrace();
      } catch (Exception e2) {
     
      // TODO: handle exception
      }
              }
                try {
    conn.close();
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
            }savepoint我只是知道,并没有去实现过,他的作用只是告诉你在什么回滚到什么地方,上面的代码是简单的全回滚
      

  3.   

    Savepoint sp=con.setSavepiont();
    con.rollback(sp);
    这样吧
      

  4.   

    回复2楼,我在下面这两句之间
    a = stmt.executeUpdate(sql); 
    b = stmt.executeUpdate(str); 
    加入了一个10/0的操作,结果代码运行之后,竟然只是抛异常,并没有回滚。
    实现事务方面的代码也没有报错!只是说“除数为0”了,然后第一句还是执行了,第二句就转到异常处理那里了。
      

  5.   

    所以说你要设置autoCommit是false的话,提交的控制权在你的手上啊出错的话你在catch中调用con.rollback()
    正常就在末尾调用con.commit()正常的逻辑就是这个样子!关于savePoint,只是一个回滚的保存点,我们rollback可以选择回滚到事务开始或者是回滚到保存点
      

  6.   

    把SQLException e 改成Exception
      

  7.   

    非常感谢2楼,搞掂了。
    原来我自己搞错了。
    我把Statement写到DB类里面了,其他业务逻辑层是写到Biz的类里面去了。
    为了做这个事务,我只好又把Statement写回了Biz的类文件里面去了。这样就可以回滚了。
    但不知道我把Statement写到Biz类文件里面是否合乎规范?