相当奇怪的问题,高分求救--Hibernate 的 事务回滚 transaction.rollback()问题 try{ trans.rollback();}catch(HibernateException ex){ ex.printStackTrace();} 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 谢谢啦.可是问题是,有时候我直接在tx.commit()后面加一句tx.rollback()这样子直接回滚也会报错,或者根本没有rollback回去..请问这个是什么原因啊...大侠是确实试过这个代码可以rollback 吗?? 你commit之后怎么回滚呢??倒,commit就是提交,意味着此次事务处理已经完成.... 谢谢killme的意见,我也听到有这样的意见,试过将commit去掉或者放在rollback()之后.结果还是一样,退不回去.. 像这样直接执行,数据库同样没有回滚回去,还请各位大侠给意见啊.. tx = session.beginTransaction(); session.save(userTemp); System.out.println("-----------run run Lorra---------"); tx.rollback(); System.out.println("-----------run run Lorra meme---------"); java,Struts,Hibernate,Spring技术论坛群一号群:9967568,如人满请加二号群:4705749。真诚欢迎各位朋友来学习探讨 倒,你把commit去掉能插入数据吗??你倒做做让我见识下.什么叫rollback?这是为了在你更新数据过程中出错,回滚至更新前的状态,在你未commit之前(或者commit成功之前)都可以进行回滚,而commit是什么意思?提交,当你确认你更新的数据是你所希望的,你可以提交,此时数据库才真正地更新数据,没有commit之前数据都是未变的.我建议你了解下数据库事务处理的一些概念.所以一般的写法是这样:try { tx = session.beginTransaction(); String strDelete = "delete from User where userNumber='" + userNumber + "'"; Query query = session.createQuery(strDelete); query.executeUpdate(); tx.commit(); session.flush(); return true; } catch (HibernateException e) { try{ tx.rollback(); return false; } catch(HibernateException ex){ ex.printStackTrace(); } } killme2008大侠,就我现在正在写的程序来说,没有明示的commit数据也提交成功了..起码这一句是:tx = session.beginTransaction(); session.save(userTemp); System.out.println("-----------run run Lorra---------"); System.out.println("-----------run run Lorra meme---------");//即使这里不用tx.commit()数据已经在数据库了.. 何解?? 既然在tx.commit()前可以随时rollback()为什么,我rollback()了数据照样已经插入了啊而没有删除.??? 大侠别走,偶啥也不懂,还请多多指教啊..如果可能的话,随便写一个可以明确进行rollback的例子看看也好啊..到现在为止,好像有几个人和我说过rollback不回去..如果大侠能帮到的话,真的是感激不尽了.. 你在蒙我吧...你不用commit,竟然可以插入数据,不是你见鬼了,就是我见鬼了...想尝试回滚?简单,人工抛个异常看看:session.save(user); session.flush(); throw new RuntimeException("shit"); } catch (Exception e) { try { tran.rollback(); } catch (HibernateException e2) { e2.printStackTrace(); } } 次序问题。commit() 和 flush() 的次序。rollback() 之前你为什么要 session.clear() ? ; 大家不要乱说。误人子弟啊。我也刚学hibernate 自己的理解是数据库分为显示提交和隐示提交。在开发语言里可设setcommit(boolean)我用过别的开发工语言可以达到像楼主那样的想法(正常没人这么写只是为了测试)但是hibernate 必须tr.commit;才能提交数据否则不会自动提交的。既然提交了就当然不能rollback。异常产生hibernate 会自动rollback也可以手写rollback。(自己的理解不一定对)良好的习惯。Student s = new Student(); s.setId("32543"); //key s.setName("sdf"); Student s1 = new Student(); s1.setId("32543");//key s1.setName("a"); Session session= HibernateSessionFactory.currentSession(); Transaction tr = session.beginTransaction(); try{ session.save(s); session.save(s1); //产生异常。因为key 重复 tr.commit(); }catch (HibernateException e) { tr.rollback(); //可有可无(因为根本就没有commit;对hibernate 的rollback 我也不太明白。请大家指教啊) }} 什么可有可无??倒,楼上的是你在误倒在session.save()操作中可能抛出受控异常HibernateException,抛出此异常说明hibernate插入失败,需要回滚. to 楼上的请举个列子吧。其实我也就是想知道tr.rollback()如何回滚(我不管数据库那层的事务,回滚。其实我也做了多年的数据库了。现在只是讨论hibernate的rollbacK())我的理解是hibernate 只有commit后才去造作后台数据。在产生异常之前你没有comit;所以在异常里写rollback 的用处我就不明白了。我给你举个列子。我在别的语言里用到的。当然只是我的测试。正常我也不会这样写的commit(true); sql: insert to table; rollback;//如过我写上 这句数据是不会插入的。因为回滚了。如过不写这句就回插入数据。。请举个hibernate rollback 的列子吧 请注意,hibernate是禁止立即自动提交事务的.下面是hibernate文档里面的原话:一个hibernate抛出的异常意味着你必须立即回滚数据库事务,并立即关闭session.如果你的session绑定到一个应用程序上,你必须立即停止该应用程序.回滚数据库事务并不会把你的业务对象退回到事务启动时的状态,这意味着数据库状态和业务对象状态不同步.通常情况下这不是什么问题,因为异常是不可恢复的,你必须在回滚之后重新开始执行.我对数据库事务的了解不深入,我的理解是,在产生异常时,hibernate是不会自动回滚的,回滚的操作必须由你自己来完成.在老版本中HibernateException是个受控异常,在hiberante3中却是一个非受控异常,处理方式改变了,在3中,我要么抛出到顶层,封装错误消息给用户,要么采用其他的处理手段. 在非托管环境中,因为hibernate是禁止立即提交事务,所以说你上面举的例子在hibernate中是无效.当然,一般结合spring,由spring来托管事务处理(开始,提交,回滚). 帮忙看一下,这个目录结构是用什么工具开发的javaweb工程 谁有基于java_EE的论坛系统与设计的源码啊?毕业设计使用,急求!!! 求1个正则表达式 jsf和struts重点学习的思想是什么 请教个问题,请多帮忙 hibernate是否支持复合查询 struts学习 请教windows xp下面apache server和tomcat的整合~~~ 在wszs5.0开发调试 sessionbean通过本地接口调用实体bean,提示本地接口找不到 关于EJB QL排序问题 Proxool连接池中文乱码如何解决 菜鸟问题1:望各位大侠指教!
tx = session.beginTransaction(); session.save(userTemp);
System.out.println("-----------run run Lorra---------");
tx.rollback();
System.out.println("-----------run run Lorra meme---------");
什么叫rollback?这是为了在你更新数据过程中出错,回滚至更新前的状态,在你未commit之前(或者commit成功之前)都可以进行回滚,而commit是什么意思?提交,当你确认你更新的数据是你所希望的,你可以提交,此时数据库才真正地更新数据,没有commit之前数据都是未变的.我建议你了解下数据库事务处理的一些概念.所以一般的写法是这样:
try {
tx = session.beginTransaction(); String strDelete = "delete from User where userNumber='" +
userNumber + "'";
Query query = session.createQuery(strDelete);
query.executeUpdate();
tx.commit();
session.flush();
return true; } catch (HibernateException e) {
try{
tx.rollback();
return false;
}
catch(HibernateException ex){
ex.printStackTrace();
}
}
System.out.println("-----------run run Lorra---------");
System.out.println("-----------run run Lorra meme---------");
//即使这里不用tx.commit()数据已经在数据库了.. 何解??
session.save(user);
session.flush();
throw new RuntimeException("shit");
} catch (Exception e) {
try {
tran.rollback();
} catch (HibernateException e2) {
e2.printStackTrace();
}
}
rollback() 之前你为什么要 session.clear() ? ;
我也刚学hibernate 自己的理解是
数据库分为显示提交和隐示提交。在开发语言里可设setcommit(boolean)
我用过别的开发工语言可以达到像楼主那样的想法(正常没人这么写只是为了测试)
但是hibernate 必须tr.commit;才能提交数据否则不会自动提交的。既然提交了就当然不能
rollback。异常产生hibernate 会自动rollback也可以手写rollback。(自己的理解不一定对)良好的习惯。
Student s = new Student();
s.setId("32543"); //key
s.setName("sdf");
Student s1 = new Student();
s1.setId("32543");//key
s1.setName("a");
Session session= HibernateSessionFactory.currentSession();
Transaction tr = session.beginTransaction();
try{ session.save(s);
session.save(s1); //产生异常。因为key 重复
tr.commit();
}catch (HibernateException e) {
tr.rollback(); //可有可无(因为根本就没有commit;对hibernate 的rollback 我也不太明白。请大家指教啊)
}}
在session.save()操作中可能抛出受控异常HibernateException,抛出此异常说明hibernate插入失败,需要回滚.
其实我也就是想知道tr.rollback()如何回滚(我不管数据库那层的事务,回滚。其实我也做了多年的数据库了。现在只是讨论hibernate的rollbacK()
)我的理解是hibernate 只有commit后才去造作后台数据。在产生异常之前你没有comit;所以在异常里写rollback 的用处我就不明白了。我给你举个列子。我在别的语言里用到的。当然只是我的测试。正常我也不会这样写的commit(true);
sql: insert to table;
rollback;//如过我写上 这句数据是不会插入的。因为回滚了。
如过不写这句就回插入数据。。
请举个hibernate rollback 的列子吧
下面是hibernate文档里面的原话:一个hibernate抛出的异常意味着你必须立即回滚数据库事务,并立即关闭session.如果你的session绑定到一个应用程序上,你必须立即停止该应用程序.回滚数据库事务并不会把你的业务对象退回到事务启动时的状态,这意味着数据库状态和业务对象状态不同步.通常情况下这不是什么问题,因为异常是不可恢复的,你必须在回滚之后重新开始执行.我对数据库事务的了解不深入,我的理解是,在产生异常时,hibernate是不会自动回滚的,回滚的操作必须由你自己来完成.在老版本中HibernateException是个受控异常,在hiberante3中却是一个非受控异常,处理方式改变了,在3中,我要么抛出到顶层,封装错误消息给用户,要么采用其他的处理手段.