try {
Session session = HibernateSessionFactory.getSession();
// tx = session.beginTransaction();
PreparedStatement stmt = session.connection().prepareStatement(
"insert into Channel  (URL) values(?)");
stmt.setString(1,"http://www.arsenalsingapore.com/forum/index.php?board=5.1");
stmt.addBatch();
stmt.setString(1,"http://www.arsenalsingapore.com/forum/index.php?board=5.0");
stmt.addBatch();
stmt.setString(1,"http://www.arsenalsingapore.com/forum/index.php?board=5.2");
stmt.addBatch();
stmt.setString(1,"http://www.arsenalsingapore.com/forum/index.php?board=5.3");
stmt.addBatch();
stmt.executeBatch();
// tx.commit();
} catch (BatchUpdateException e) {
System.out.println("异常已经捕获");
// tx.rollback();
System.out.println(e.getUpdateCounts().length);
e.printStackTrace();
for (int i = 0; i < e.getUpdateCounts().length; i++) {
System.out.println(e.getUpdateCounts()[i] + "*********");
}
} catch (HibernateException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
Channel表中URL设置的是UK,而‘http://www.arsenalsingapore.com/forum/index.php?board=5.0’在数据库中已经存在。
于是问题如下:
1.批处理能否进行rollback?看到有朋友说批处理不需要用事务来管理,那批处理真的无法rollback吗?或者遇到因为数据库有UK的情况无法回退?
2.该程序的运行结果是:1、3、4这四条记录被插入到数据中。e.getUpdateCounts()中的值是1、-3、1、1。想必-3应该是Statement.EXECUTE_FAILED的意思。但是api中有这么一句After a command in a batch update fails to execute properly and a BatchUpdateException is thrown, the driver may or may not continue to process the remaining commands in the batch. 难得Mysql的驱动是必须完全执行完毕的吗?
3.在实际项目中,一般采取什么样的形式处理这个异常?全部数据rollback,还是正确数据插入,错误数据返回提示信息?假如是MySQL的话,莫非就要去根据e.getUpdateCounts()中-3存在的位置来返回具体的信息?

解决方案 »

  1.   

    我没有用过mysql不知道他的事务是怎样管理的
    但是Sqlserver他是默认一条sql语句就是一个事务
    而Oracle的批处理事务他是可以进行回滚的 
    你可以在你的语句中间设置回滚点啊 事务出错的话 就回滚的回滚点
    如果楼主实在不行 就让数据库去处理你的事务
    不过从性能上来说 这是不推荐这种处理方式的
      

  2.   

    你好,不好意思,这么晚给你回复。
    我想问下:
    1.语句中如何自己设置回滚点?自己开启个事务建立回滚点?
    2.怎么交由数据库处理事务?
    谢谢你的回复,N久没人理我了,感动ing
      

  3.   

    - - 找了N久,问题终于解决,Mysql的表单的type类型只有是InnoDB和BDB时才支持事务管理。