环境 : MySql操作 : 批量新增要求 : 如果其中一笔数据出现错误,掠过这一笔,继续新增下一笔数据。
例 : 共有 5 笔数据,其中第3笔出现错误,不能新增到DB, 那么继续处理后面的 2 笔,最后新增到DB中的数据
应该有 4 笔(第1,2,4,5笔)。使用以下代码,最后DB中一笔数据也没有
// method startTransaction tx = this.session.beginTransaction();
for (int i = 0; i < list.size(); i++) {
try {
this.session.saveOrUpdate(list.get(i));
}
catch (HibernateException e) { }
}tx.commit();// method end
后又改了一下代码,还是不行。出错那笔数据以前新增的,可以成功,但是以后的全都不能新增
即 : 共有 5 笔, 第 3 笔出错,DB 中只能新增第1,2笔,第3,4,5笔都不行// method start
for (int i = 0; i < list.size(); i++) {
try {
Transaction tx = this.session.beginTransaction();
this.session.saveOrUpdate(list.get(i)); tx.commit();
}
catch (HibernateException e) {
// ~~~
}
}
// method end
那位大侠可以解决,不胜感激!
例 : 共有 5 笔数据,其中第3笔出现错误,不能新增到DB, 那么继续处理后面的 2 笔,最后新增到DB中的数据
应该有 4 笔(第1,2,4,5笔)。使用以下代码,最后DB中一笔数据也没有
// method startTransaction tx = this.session.beginTransaction();
for (int i = 0; i < list.size(); i++) {
try {
this.session.saveOrUpdate(list.get(i));
}
catch (HibernateException e) { }
}tx.commit();// method end
后又改了一下代码,还是不行。出错那笔数据以前新增的,可以成功,但是以后的全都不能新增
即 : 共有 5 笔, 第 3 笔出错,DB 中只能新增第1,2笔,第3,4,5笔都不行// method start
for (int i = 0; i < list.size(); i++) {
try {
Transaction tx = this.session.beginTransaction();
this.session.saveOrUpdate(list.get(i)); tx.commit();
}
catch (HibernateException e) {
// ~~~
}
}
// method end
那位大侠可以解决,不胜感激!
还有,你后改的那个方法极不可取,自己玩玩还可以。
不用 sorry, 你帮我想个办法就行了, 哈~
抛出异常后,并catch后,程序不就在抛出的点终止了么?
for (int i = 0; i < list.size(); i++) {
try {
Transaction tx = this.session.beginTransaction();
this.session.saveOrUpdate(list.get(i)); tx.commit();
}
catch (HibernateException e) {
tx.rollback();
// ~~~
}
}
// method en
如果交给SPRING控制事务,那就简单多了
如果异常被 Catch 住,则 Catch 以后的代码依然会执行,但是从出错点到Catch之间的代码不会执行。
就此代码而言,异常被Catch住后,会继续执行 Catch 一下的代码,但是 Catch 一下已经没有代码了,
所以会继续执行下一次循环。
Transaction tx = session.getTransaction();
for (int i = 0; i < list.size(); i++) {
try {
tx.begin();
this.session.saveOrUpdate(list.get(i)); tx.commit();
}
catch (HibernateException e) {
tx.rollback();
}
finally{
tx = session.getTransaction();
}
}不知道行不行
try {
this.session.saveOrUpdate(list.get(i));
tx.commit();//如果不用这句话要把session变成自动提交
}
catch (HibernateException e) { }
}
try {
this.session.saveOrUpdate(list.get(i));
tx.commit();//如果不用这句话要把session变成自动提交
}
catch (HibernateException e) { }
} 你的问题似乎和事务没有关系。把事务去掉试试。
因为你这个批处理不要保证数据的事务的原子性(当有一条记录错误时,直接过,接着往下走)。
for (int i = 0; i < list.size(); i++) {
try {
Transaction tx = this.session.beginTransaction();
this.session.saveOrUpdate(list.get(i)); tx.commit();
}
catch (HibernateException e) {
if(tx!=null){
tx.rollback();
}
// ~~~
}finally{
if(session!=null){
session.close();
}
}
}
// method en
看看这样行不