论坛首页 Java企业应用论坛

关于J2EE事务管理的疑惑

浏览 10090 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-04-21  
问题:如果要在一个事务中同时做消息发送和数据库更新,是否能够保证事务的完整性?
背景:有一笔业务将会提交包括汇总信息和明细信息两类业务数据,其中汇总信息因为会影响到下一笔业务,必须马上更新到数据库中,明细信息数据量非常大,不需要实时更新,准备放在消息队列中,安排计划任务更新。两个操作应该是需要同时保证其成功完成,否则就需要回到原来的状态。
原来对J2EE中事务管理的理解不是很深,不知道事务能否支持这种情况?
   发表时间:2004-04-21  
使用jta的事务,jdbc需要支持XA
0 请登录后投票
   发表时间:2004-04-21  
用XA还是不能解决楼主的问题。楼主的问题比较复杂,建议你可以看一下《EBJ编程指南》,中间对这种问题进行了一些描述(不过还不足以解决实际问题)。现在你的情况是这样的:实时和异步同时存在,那么这两个肯定不能在一个本地事务中间得到解决,只能是嵌套事务,但是J2EE又不支持嵌套,并且事务的时间也是有限制的,像楼上那种消息队列的异步更新方式时间就无非确定了,所以你这个问题不是一般的事务可以解决的。
   不过我们可以修改策略,也就是所谓的补偿事务:确保在消息队列中的更新A是在实时更新B之后,这样,我们就可以通过实时更新的结果(成功或回滚)来确定是否需要执行消息队列的更新A。同时,消息队列的更新A如果执行出现失败,那么实时更新B的就需要回滚(其实不是回滚,而是人为撤销)。当然,这样,又带来一个问题,就是要确保在消息队列更新A执行前,没有其他东西读取或者更新过实时更新B。
    说到这里,其实也就是一种变形了的分布式事务了。楼主如果有兴趣,可以看看Sybase的EA Server,它是号称可以支持分布式事务的。当然,我也不清楚究竟是怎样实现的。
    因为这个问题太复杂,不是一般人能做到的(大部分应用服务器商也无法做到),所以我也只能提到这里(唉,技术所限),希望对楼主有些帮助。
0 请登录后投票
   发表时间:2004-04-21  
ah_cai 写道
问题:如果要在一个事务中同时做消息发送和数据库更新,是否能够保证事务的完整性?
背景:有一笔业务将会提交包括汇总信息和明细信息两类业务数据,其中汇总信息因为会影响到下一笔业务,必须马上更新到数据库中,明细信息数据量非常大,不需要实时更新,准备放在消息队列中,安排计划任务更新。两个操作应该是需要同时保证其成功完成,否则就需要回到原来的状态。
原来对J2EE中事务管理的理解不是很深,不知道事务能否支持这种情况?


这个需求本身有矛盾。
汇总信息会影响下一笔业务,因此需要马上更新。
明细信息不需要实时更新,准备安排计划任务更新。

那么也就是说,下一笔业务,不需要等待明细信息更新完成,就应该可以开始。

但是,你同时又希望两个任务要同时保证其成功完成,否则需要退回到原来的状态,那么事实上,你又必须等待明细信息全部完成,才“敢”开始下一笔业务。

这就是矛盾!

那么,你的下一笔业务,到底能不能等?!
0 请登录后投票
   发表时间:2004-04-21  
我想楼主的意思是保证汇总信息的更新与消息的发送是在一个事务里头,就是说,如果汇总消息更新冇异常,而消息发送的时候发不出去,那么汇总消息的更新需要回滚。至于消息发送成功后消息如何处理不是这个事务里面的事情,其实只要发送成功,JMS就可以保证该消息能正确处理。关键是JMS和DB这两个东西如何放在一个事务里面。JMS的connection factory可以选择enabled XA来支持JTA,而jdbc驱动如果支持XA的话,理论上可以将这两个不同的资源放到一个JTA事务里头。不过具体我也没试过,楼主可以尝试一下,然后大家分享一下。
0 请登录后投票
   发表时间:2004-04-21  
引用
我想楼主的意思是保证汇总信息的更新与消息的发送是在一个事务里头,就是说,如果汇总消息更新有异常,而消息发送的时候发不出去,那么汇总消息的更新需要回滚。至于消息发送成功后消息如何处理不是这个事务里面的事情,其实只要发送成功,JMS就可以保证该消息能正确处理。

不错,我的意思就是这样的。
对于J2EE的事务支持来说,如果是对两个不同数据库的更新,应该是通过两阶段提交可以达到保证事务完整性的目的,JTA也提供了对于JMS事务的支持,但是现在还不能确定如果在一个事务中,既有数据库更新本地事务,又有JMS本地事务,是否能够保证其完整性?
我会来做一下尝试,但是希望之前能够看到一些技术资料,从网上好像没有得到关于这方面的一些资料。
0 请登录后投票
   发表时间:2004-04-21  
楼上,我说过了,两个不同的本地事务构成了一个分布式事务,对于它,肯定是可行的,但是因为技术的复杂性,不是所有服务器都做到了。据我所知,Sybase的EA Server, Oracle 的Server ,还要IBM 的web shpere是可以做到的,至于怎么做,你就要问高人了~~~~~~~~~~
    mikeho,有兴趣,研究研究啊~~~~~~~~~~
0 请登录后投票
   发表时间:2004-04-22  
其实为什么一定要用事务来管理呢??
那当然如果可以的话最好,如果不行话,就用折衷的方法罗.
先插入汇总信息,然后获得它的唯一标识.

再异步进行明细信息操作,如果出现异常就删掉汇总信息罗.
0 请登录后投票
   发表时间:2004-04-23  
xiaoyu 写道

先插入汇总信息,然后获得它的唯一标识.

再异步进行明细信息操作,如果出现异常就删掉汇总信息罗.

有点偏差了,打个比方,现在有汇总信息和明细信息要放到仓库(数据库)里面去,为了不至于在进仓库的时候太忙,我就把汇总信息先放到仓库中,把明细信息交给一个人让他在仓库空闲的时候放进去。现在我的问题是需要保证汇总信息放到仓库和明细信息交给代理人这两个操作在一个事务中完成。而楼上所言,是指代理人在空闲的时候把明细信息放到仓库的操作中如果出现异常信息如何处理的问题。
0 请登录后投票
   发表时间:2004-04-23  
我想知道为什么要在一个事务完成(是不是要保证完整性呢??)?
0 请登录后投票
论坛首页 Java企业应用版

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