首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

JDBC 批处理 没法回滚

2012-12-29 
JDBC 批处理 无法回滚/** * 预编译+批处理模式更新数据 * */@SuppressWarnings(deprecation)private boo

JDBC 批处理 无法回滚

 /** * 预编译+批处理模式更新数据 * */@SuppressWarnings("deprecation")private boolean batchExecuteInsertTest(){boolean isok = true;Session session = this.getHibernateTemplate().getSessionFactory().openSession();Connection conn=null;//连接PreparedStatement pstm=null; //预编译语句String pstmSql = null;Savepoint sp = null;try {conn = session.connection();conn.setAutoCommit(false); // 设置不自动提交  sp = conn.setSavepoint();//设置回滚点pstmSql =  "insert into  test(id,name) values (?,?)";pstm = conn.prepareStatement(pstmSql);int recordNum = 1; // 计数器              int commit_size = 2;// 每次提交记录数2            pstm.setString(1, "5");//            pstm.setString(2, "5——列数据");            pstm.addBatch();            int total = 5;//循环队列  for (int i = 1; i <= total; i++) {recordNum++; // 计数 pstm.setString(1, i+"");//pstm.setString(2, i+"列数据");//pstm.addBatch();// 每1000次提交一次if (recordNum %  commit_size == 0) {// 可以设置不同的大小;如50,100,500,1000等等pstm.executeBatch();conn.commit();pstm.clearBatch();conn.setAutoCommit(false);  pstm = conn.prepareStatement(pstmSql); }} if (recordNum % commit_size != 0) { //执行剩余的批处理pstm.executeBatch();                  conn.commit();              }  } catch (Exception e) {isok = false;e.printStackTrace();try {                  if (conn != null) {  // 回滚事务                   conn.rollback(sp);//回滚到那个事务点上去                    conn.commit();                }             } catch(Exception e2){          } }finally{try {if (pstm != null) {pstm.close();pstm = null;}if (conn != null) {conn.close();conn = null;}if (session != null) {session.close();session = null;}} catch (SQLException e) {e.printStackTrace();}}return isok;}

?

我设置2条记录进行提交,当执行到第6条语句时,由于主键唯一性,无法执行。却没有事务回滚,不知道怎么回事?希望各位高手指点!

热点排行