浏览 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不提供的,需要自己实现。 不知各位前辈是否有更好的方法? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2003-12-19
threadlocal也不是什么困难的事情,前面我已经贴出来过代码,用threadlocal有什么不可以?
另外Hibernate一样可以用JTA,为什么不用? |
|
返回顶楼 | |
发表时间:2003-12-19
robbin 写道 threadlocal也不是什么困难的事情,前面我已经贴出来过代码,用threadlocal有什么不可以?
我觉得这应该是hibernate的基本功能,不然就不能叫做面向对象了,因为面向对象应该事务处理的封装,我认为事务处理的封装应该对系统开发是很重要的。本人愚见。 robbin 写道 另外Hibernate一样可以用JTA,为什么不用? 关键是不是所有的平台都对jts的支持,另外如开发application也没法用呀。 |
|
返回顶楼 | |
发表时间:2003-12-19
是事务的封装,我觉得一种办法是使用ThreadLocal,有点AOP的味道了。另一种是放在EJB里面,由容器管理事务来封装。
其实对于事务的封装和Hibernat没有关系的,即使你用JDBC编程,你一样要面临这样的问题,只要你把数据持久层分离出来的话。 |
|
返回顶楼 | |
发表时间:2003-12-19
这可以用很简单的方法来解决, 比如给f1(), f2()加一个AutoCommit的参数,
当他们单独用时AutoCommit=true, 自己处理事务. 合在一起用时AutoCommit=false, 然后在f3()里处理事务, 只有多数据库环境才用分布式事务 |
|
返回顶楼 | |
发表时间:2003-12-19
robbin 写道 是事务的封装,我觉得一种办法是使用ThreadLocal,有点AOP的味道了。另一种是放在EJB里面,由容器管理事务来封装。
其实对于事务的封装和Hibernat没有关系的,即使你用JDBC编程,你一样要面临这样的问题,只要你把数据持久层分离出来的话。 我只是觉得既然hibernate已经做到这个份,不如好事做到底,一起解决。 谢谢robbin。 |
|
返回顶楼 | |
发表时间: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就可以了。 |
|
返回顶楼 | |
发表时间:2003-12-22
老大你让我在google搜索什么了?关键词是什么?谢谢
还有你下面那个东东是如何实现的? |
|
返回顶楼 | |
发表时间: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等信息签名档是一个动态生成的图片,看图片属性就有那个网站的链接。:) |
|
返回顶楼 | |