环境: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语句失败时回滚?
部分代码如下: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条成功插入,而后面的没有插入。
如果是部分可正确执行的时候,应该分次提交吧!最好保证执行一次,仅执行一个SQL。
例如你上面的SQL,其实是3个单独的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();
}