调用多个DAO中的方法时,那怎么样来保证操作的事务性呢?

yhp 2004-09-11 06:49:36
目前系统已经把各个实体对象都已经做成一定的VO类,也已经建立了相应的DAO类进行数据库的操作。但现在有一个问题,例如:一个部门,它有对应的DeptDAO,而部门的成员有DeptUserDAO。当需要删除一个部门的时候,我们也必须删除它相应的部门成员。即调用DeptDAO.remove时也必须调用DeptUserDAO.remove,而且这两个动作必须在一个事务中处理。由于这两个DAO都调用的是各自数据库连接,那我怎么样来保证这个操作的事务性呢?利用java中的JTA吗?
...全文
1335 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
redex 2005-01-22
  • 打赏
  • 举报
回复
这篇文章不错,看看:
http://www-128.ibm.com/developerworks/java/library/j-dao/index.html
mudsong 2005-01-21
  • 打赏
  • 举报
回复
原来的你的代码是要这样写的

//事务开始
save(user) //业务逻辑
update(group) //业务逻辑
//提交事务

使用动态代理类后,代码就变成了这样

//得到代理类
save(user) //业务逻辑
update(group) //业务逻辑

kingxyz 2005-01-21
  • 打赏
  • 举报
回复
mark
fantasyCoder 2005-01-21
  • 打赏
  • 举报
回复
一般事务分为两钟,可以选其中一种
1.局部事务处理,方法体内获取连接资源,并调用commit,rollback来控制事务.
当然将连接做为参数穿递到若干方法体内,并统一的控制也属于局部事务
2.全局事务,全部事务为容器级别的事务,代码本身不用过多的关心事务的处理,多配合
使用XA使用,并且依赖数据库是否支持,EJB的CMT,Spring的声明事务处理都是全局事务.
wwwer1 2005-01-21
  • 打赏
  • 举报
回复
to:flyingbug
你那种方法谁都知道,楼主想的是不同的dao怎样能取得同一个连接

to:楼主
你去看看jdk的ThreadLocal类。这个类能够为一个线程保存一个对象。
你的一个事务肯定要在一个线程内做完的,这个毫无疑问。
你可以在你的业务逻辑类中调用多个dao模型。
调用dao之前创建一个connection,将其放入ThreadLocal内(set方法)
dao中用ThreadLocal的get方法将该线程保存的对象取出,进行操作
只要你的多个dao在一个线程内,那么你取得的连接肯定是相同的
bwsabc 2005-01-20
  • 打赏
  • 举报
回复
这么麻烦,用hibernate搞定算了。
sky7 2005-01-20
  • 打赏
  • 举报
回复
如是多个数据库连接,只有用JTA.
如是单个数据库连接,可在action中将Connection作为参数传到各个Dao中,
在action中作事务控制即可.
lkjavafan 2004-11-18
  • 打赏
  • 举报
回复
http://blog.csdn.net/lkjavafan/archive/2004/11/18/185476.aspx

看一下,我结合网友的资料搞的,个人感觉是不错的
listhome 2004-11-16
  • 打赏
  • 举报
回复
GZ
QOUIQWOQ 2004-11-15
  • 打赏
  • 举报
回复
不知道DAO前端是否有EJB?如果是的话我想可以通过容器来控制:
1. 每个EJB对应一个DAO,如果DAO中有重复的代码,可以抽象出父类等来解决
2. DAO间不相互调用
3. DB Connection在EJB中维护:获取、释放等,作为参数传入到DAO中
4. 发生异常后,通过EJBContext设置回滚:EJBContext.setRollbackOnly()
fantasyCoder 2004-11-15
  • 打赏
  • 举报
回复
楼上的方法太不好了 ...
代码里会有大量的if/else
在连接关闭的时候
也会有大量的
if/else,
呵呵...
huangshazq 2004-11-15
  • 打赏
  • 举报
回复
在dao中的每个方法中加一个事务参数,方法实现的时候先判断事务参数是否为null,如果null,则创建事务,否则利用传入的事务。并且只有null的时候进行事务的提交回滚操作。
fantasyCoder 2004-11-10
  • 打赏
  • 举报
回复
在没有使用AOP容器的情况下
最理想的事务控制办法是在DAO上增加Service层
连接的打来和关闭均在Service层做

当然,一个Service类一般会使用多个DAO类,我的办法是
从构照方法里注入这些DAO的接口,ok,在Service里
直接使用你需要的DAO,你只须在更高一层的Factory里
将真正的DAOImpl做为构照方法的参数传入。。。。
baffling 2004-11-09
  • 打赏
  • 举报
回复
gz
cooldoghuang 2004-09-15
  • 打赏
  • 举报
回复
继续. 帮你顶
yhp 2004-09-14
  • 打赏
  • 举报
回复
好,越来越热闹了!
liuchuntao 2004-09-14
  • 打赏
  • 举报
回复
在做一层(PO) 组织dao中的方法
yeshucheng 2004-09-13
  • 打赏
  • 举报
回复
我不同意: flyingbug(迫切需要锻炼...) 的,:)
这样更加加剧了事物的复杂性和依赖关系
cooldoghuang 2004-09-13
  • 打赏
  • 举报
回复
同意楼上的
gong1 2004-09-13
  • 打赏
  • 举报
回复
不是跨数据库的话
建议不要用
jta。
应该在service层或者是domain层处理事物.
加载更多回复(12)

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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