环境:sqlserver,jdk1.5
部分代码如下:String sql = "insert into A (a1,a2,a3) values ('1','2','3');"; //1 
sql = sql + "insert into B (b1,b2,b3) values ('a','2','3');";  //2  
sql = sql + "insert into C (c1,c2,c3) values ('1','2','3');";  //3  
////////////////////////////////////
Connection conn = null;  
Statement sm = null;  
try {   
  conn = ds.getConnection();   
  conn.setAutoCommit(false);   
  sm = conn.createStatement();   
  sm.executeUpdate(sql);   
  conn.commit();  
}  catch (SQLException e) {   
     try{    
        conn.rollback();   
     }catch (SQLException ex){ }   
    e.printStackTrace();  
}这段代码的执行结果是完全通过没有任何错误,但是sql的第二行其实在数据库里面是insert不进去的,因为第一个变量是number类型,而此时给的是字符类型。在数据中的表现是三条insert语句只有第一条insert成功,后两条是失败的。我想请问,此处的事务控制只能捕获sql语句语法上的错误,然后进行回滚吗?若是这种sql语句部分可正确执行,部分无法执行的情况,该如何给其加事务控制,让他在部分的insert语句失败时回滚?

解决方案 »

  1.   

    这里应该没有涉及到回滚,因此程序都正常执行了,只不过到第2条的时候,执行出错,后面的SQL没有执行。
    所以导致第1条成功插入,而后面的没有插入。
    如果是部分可正确执行的时候,应该分次提交吧!最好保证执行一次,仅执行一个SQL。
    例如你上面的SQL,其实是3个单独的SQL,最好是分3次进行执行提交。  
      

  2.   

    如果我想将多条sql放在一起执行,这个没有回滚的问题如何解决?
      

  3.   


    你还是得写3个SQL,只是在一起执行,也就是3个sm.executeUpdate(sql);  
    下面的代码参考下: String sql1 = "insert into A (a1,a2,a3) values ('1','2','3');"; //1  
    String sql2 = "insert into B (b1,b2,b3) values ('a','2','3');";  //2   
    String sql3 = "insert into C (c1,c2,c3) values ('1','2','3');";  //3   
    //////////////////////////////////// 
    Connection conn = null;   
    Statement sm = null;   
    try {   
         conn = ds.getConnection(); 
         conn.setAutoCommit(false);      
         sm = conn.createStatement();      
         sm.executeUpdate(sql1);  
         sm.executeUpdate(sql2); 
         sm.executeUpdate(sql3);    
          conn.commit();  
         }  
         catch (SQLException e) {       
          try{         
            conn.rollback();  
            }
            catch (SQLException ex){ }     
              e.printStackTrace(); 
            } 
      

  4.   

    一个执行请求只能处理一条sql,,除非使用存储过程。。