BatchUpdateException 批处理问题(异常处理高手进)

synge_pan 2009-08-21 09:36:15
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存在的位置来返回具体的信息?
...全文
2041 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
synge_pan 2009-08-25
  • 打赏
  • 举报
回复
- - 找了N久,问题终于解决,Mysql的表单的type类型只有是InnoDB和BDB时才支持事务管理。
synge_pan 2009-08-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xiaozejun 的回复:]
我没有用过mysql不知道他的事务是怎样管理的
但是Sqlserver他是默认一条sql语句就是一个事务
而Oracle的批处理事务他是可以进行回滚的
你可以在你的语句中间设置回滚点啊 事务出错的话 就回滚的回滚点
如果楼主实在不行 就让数据库去处理你的事务
不过从性能上来说 这是不推荐这种处理方式的
[/Quote]
你好,不好意思,这么晚给你回复。
我想问下:
1.语句中如何自己设置回滚点?自己开启个事务建立回滚点?
2.怎么交由数据库处理事务?
谢谢你的回复,N久没人理我了,感动ing
synge_pan 2009-08-22
  • 打赏
  • 举报
回复
- - 沉下去了,刷下
xiaozejun 2009-08-22
  • 打赏
  • 举报
回复
我没有用过mysql不知道他的事务是怎样管理的
但是Sqlserver他是默认一条sql语句就是一个事务
而Oracle的批处理事务他是可以进行回滚的
你可以在你的语句中间设置回滚点啊 事务出错的话 就回滚的回滚点
如果楼主实在不行 就让数据库去处理你的事务
不过从性能上来说 这是不推荐这种处理方式的
synge_pan 2009-08-21
  • 打赏
  • 举报
回复
- - 这个问题太简单还是太难啊?页面刷新了一天了,还是没有回复!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧