相当奇怪的问题,高分求救--Hibernate 的 事务回滚 transaction.rollback()问题

loveyou1234 2006-05-11 08:15:30
大家在用Hibernate的事务的时候,是不是那个rollback()基本上不起作用,或者说有时候用的时候反倒会出现异常啊??

具体可以看如下的一个实例:

Transaction tx = null;
List Users = null;
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 (Exception e)

{
session.clear();
tx.rollback();
e.printStackTrace();
return false;
}


情况就是即使是发生了异常,跳到了
{
session.clear();
tx.rollback();
e.printStackTrace();
return false;
}
执行,一则tx.rollback()会报错,说是:the transaction not successfully started.二则可能是tx.rollback()执行了但是完全没有rollback()回去..

请问各位大侠有没有遇到这样的问题啊..真的太感激各位了如果可以帮到小弟的话!!!
...全文
931 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
killme2008 2006-05-15
  • 打赏
  • 举报
回复
在非托管环境中,因为hibernate是禁止立即提交事务,所以说你上面举的例子在hibernate中是无效.当然,一般结合spring,由spring来托管事务处理(开始,提交,回滚).
killme2008 2006-05-15
  • 打赏
  • 举报
回复
请注意,hibernate是禁止立即自动提交事务的.
下面是hibernate文档里面的原话:

一个hibernate抛出的异常意味着你必须立即回滚数据库事务,并立即关闭session.如果你的session绑定到一个应用程序上,你必须立即停止该应用程序.回滚数据库事务并不会把你的业务对象退回到事务启动时的状态,这意味着数据库状态和业务对象状态不同步.通常情况下这不是什么问题,因为异常是不可恢复的,你必须在回滚之后重新开始执行.

我对数据库事务的了解不深入,我的理解是,在产生异常时,hibernate是不会自动回滚的,回滚的操作必须由你自己来完成.在老版本中HibernateException是个受控异常,在hiberante3中却是一个非受控异常,处理方式改变了,在3中,我要么抛出到顶层,封装错误消息给用户,要么采用其他的处理手段.
killme2008 2006-05-14
  • 打赏
  • 举报
回复
什么可有可无??倒,楼上的是你在误倒
在session.save()操作中可能抛出受控异常HibernateException,抛出此异常说明hibernate插入失败,需要回滚.
tmxkdldw 2006-05-14
  • 打赏
  • 举报
回复
to 楼上的请举个列子吧。
其实我也就是想知道tr.rollback()如何回滚(我不管数据库那层的事务,回滚。

其实我也做了多年的数据库了。现在只是讨论hibernate的rollbacK()
)我的理解是hibernate 只有commit后才去造作后台数据。

在产生异常之前你没有comit;所以在异常里写rollback 的用处我就不明白了。



我给你举个列子。我在别的语言里用到的。当然只是我的测试。正常我也不会这样写的

commit(true);
sql: insert to table;
rollback;//如过我写上 这句数据是不会插入的。因为回滚了。
如过不写这句就回插入数据。。


请举个hibernate rollback 的列子吧
tmxkdldw 2006-05-14
  • 打赏
  • 举报
回复
大家不要乱说。误人子弟啊。
我也刚学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 我也不太明白。请大家指教啊)

}}

humanity 2006-05-12
  • 打赏
  • 举报
回复
次序问题。

commit() 和 flush() 的次序。
rollback() 之前你为什么要 session.clear() ? ;
killme2008 2006-05-11
  • 打赏
  • 举报
回复
你在蒙我吧...你不用commit,竟然可以插入数据,不是你见鬼了,就是我见鬼了...

想尝试回滚?简单,人工抛个异常看看:
session.save(user);

session.flush();
throw new RuntimeException("shit");
} catch (Exception e) {
try {
tran.rollback();
} catch (HibernateException e2) {
e2.printStackTrace();
}
}
loveyou1234 2006-05-11
  • 打赏
  • 举报
回复
大侠别走,偶啥也不懂,还请多多指教啊..如果可能的话,随便写一个可以明确进行rollback的例子看看也好啊..

到现在为止,好像有几个人和我说过rollback不回去..如果大侠能帮到的话,真的是感激不尽了..
loveyou1234 2006-05-11
  • 打赏
  • 举报
回复
既然在tx.commit()前可以随时rollback()为什么,我rollback()了数据照样已经插入了啊而没有删除.???
loveyou1234 2006-05-11
  • 打赏
  • 举报
回复
mysql......
killme2008 2006-05-11
  • 打赏
  • 举报
回复
你用的什么数据库?
loveyou1234 2006-05-11
  • 打赏
  • 举报
回复
killme2008大侠,就我现在正在写的程序来说,没有明示的commit数据也提交成功了..

起码这一句是:

tx = session.beginTransaction();

session.save(userTemp);
System.out.println("-----------run run Lorra---------");
System.out.println("-----------run run Lorra meme---------");


//即使这里不用tx.commit()数据已经在数据库了..

何解??

killme2008 2006-05-11
  • 打赏
  • 举报
回复
倒,你把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();
}

}
lanserzhao 2006-05-11
  • 打赏
  • 举报
回复
java,Struts,Hibernate,Spring技术论坛群一号群:9967568,如人满请加二号群:4705749。真诚欢迎各位朋友来学习探讨
loveyou1234 2006-05-11
  • 打赏
  • 举报
回复
像这样直接执行,数据库同样没有回滚回去,还请各位大侠给意见啊..
tx = session.beginTransaction();

session.save(userTemp);
System.out.println("-----------run run Lorra---------");
tx.rollback();
System.out.println("-----------run run Lorra meme---------");
loveyou1234 2006-05-11
  • 打赏
  • 举报
回复
谢谢killme的意见,我也听到有这样的意见,试过将commit去掉或者放在rollback()之后.

结果还是一样,退不回去..
killme2008 2006-05-11
  • 打赏
  • 举报
回复
你commit之后怎么回滚呢??倒,commit就是提交,意味着此次事务处理已经完成....

loveyou1234 2006-05-11
  • 打赏
  • 举报
回复
谢谢啦.

可是问题是,有时候我直接在tx.commit()后面加一句tx.rollback()这样子直接回滚也会报错,或者根本没有rollback回去..请问这个是什么原因啊...

大侠是确实试过这个代码可以rollback 吗??
killme2008 2006-05-11
  • 打赏
  • 举报
回复
try{
trans.rollback();
}catch(HibernateException ex){
ex.printStackTrace();
}

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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