论坛首页 Java企业应用论坛

关于原子操作,在hibernate中是如何实现的?

浏览 4048 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2003-12-19  
有两个方法分别实现以下功能:
f1() 入库时将入库单信息持续化到数据库中。
f2() 出库时将出库单信息持续化到数据库中。
现在有增加新的需求,要求同时入库和出库
也就是:
f3()
{
  f1();
  f2();
}
当f3方法必须为原子操作,即入库和出库要么同时成功要么同时失败。

我现在知道的方法是在f3()中得到一session,再把此session作为参数传递到f1()和f2()中。
但我觉得此办法太笨了,首先要修改f1()和f2(),使其使用传递的session,而且session不好管理,如出现新的需求要将f3()和f4()作为原子操作时,又要修改f3()了。

当然如果用分布式事务连接,应该比较好解决,如下
f3()
{
  usertransction.begin();
  f1();
  f2();
  usertransction.commit();
}
但是此方法涉及jta和jts,并不是所有的应用都会用这些服务,与hibernate轻量级的理念不符合。

还有另一解方法是通过threadlocal,记住thread与session的对应关系,也可以有如分布式事务类似的实现,但这好像是hibernate不提供的,需要自己实现。

不知各位前辈是否有更好的方法?
   发表时间:2003-12-19  
threadlocal也不是什么困难的事情,前面我已经贴出来过代码,用threadlocal有什么不可以?

另外Hibernate一样可以用JTA,为什么不用?
0 请登录后投票
   发表时间:2003-12-19  
robbin 写道
threadlocal也不是什么困难的事情,前面我已经贴出来过代码,用threadlocal有什么不可以?

我觉得这应该是hibernate的基本功能,不然就不能叫做面向对象了,因为面向对象应该事务处理的封装,我认为事务处理的封装应该对系统开发是很重要的。本人愚见。

robbin 写道

另外Hibernate一样可以用JTA,为什么不用?

关键是不是所有的平台都对jts的支持,另外如开发application也没法用呀。
0 请登录后投票
   发表时间:2003-12-19  
是事务的封装,我觉得一种办法是使用ThreadLocal,有点AOP的味道了。另一种是放在EJB里面,由容器管理事务来封装。

其实对于事务的封装和Hibernat没有关系的,即使你用JDBC编程,你一样要面临这样的问题,只要你把数据持久层分离出来的话。
0 请登录后投票
   发表时间:2003-12-19  
这可以用很简单的方法来解决, 比如给f1(), f2()加一个AutoCommit的参数,
当他们单独用时AutoCommit=true, 自己处理事务.
合在一起用时AutoCommit=false, 然后在f3()里处理事务,

只有多数据库环境才用分布式事务
0 请登录后投票
   发表时间:2003-12-19  
robbin 写道
是事务的封装,我觉得一种办法是使用ThreadLocal,有点AOP的味道了。另一种是放在EJB里面,由容器管理事务来封装。

其实对于事务的封装和Hibernat没有关系的,即使你用JDBC编程,你一样要面临这样的问题,只要你把数据持久层分离出来的话。

我只是觉得既然hibernate已经做到这个份,不如好事做到底,一起解决。
谢谢robbin。
0 请登录后投票
   发表时间:2003-12-20  
difficult 写道

当然如果用分布式事务连接,应该比较好解决,如下
f3()
{
  usertransction.begin();
  f1();
  f2();
  usertransction.commit();
}
但是此方法涉及jta和jts,并不是所有的应用都会用这些服务,与hibernate轻量级的理念不符合。


jta也可以是轻量级的,从你的描述上看,你的系统不需要分布式多数据源,可以用single datasource的dummy jta实现(google一下,有opensource的,是利用connection的commit和rollback)。就算以后要切换真正的分布式jta也很方便,代码不需要修改,换个Transaction manager就可以了。
0 请登录后投票
   发表时间:2003-12-22  
老大你让我在google搜索什么了?关键词是什么?谢谢


还有你下面那个东东是如何实现的?
0 请登录后投票
   发表时间:2003-12-22  
google keyword: single datasource transaction manager
Spring:
http://www.springframework.org/docs/data_access.html (DataSourceTransactionManager for a single JDBC DataSource, using a ThreadLocal Connection under the hood)
Use hibernate with Spring:
http://www.hibernate.org/110.html

我的显示IP等信息签名档是一个动态生成的图片,看图片属性就有那个网站的链接。:)
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics