此为http://community.csdn.net/Expert/topic/4719/4719608.xml?temp=.9442102的另一给分点

解决方案 »

  1.   

    背景:1:oss是基于php及java的,radius是基于c的,billing是基于c++的,服务器之间通过socket通讯,它们操作同一个mysql数据库2:mysql 5.0以前的版本是不支持xa的,mysql的jdbc驱动也不支持xa解决方法分析:1:如果系统之间是同步调用关系,能通过判断调用结果来作事务边界处理? 不可行。

    例如:oss的一个方法m1同步调用billing的一个方法m2,如果m2失败,那m1能根据m2的返回结果让m1也不提交就是了。
    但如果如果m2成功提交,但m1失败,这个时候m2已经提交的数据不会回滚 再举个极端的例子:billing的方法执行成功,数据成功提交,但这时oss服务器当机,这个时候billing已经提交的数据也不会回滚2:能否让处理流程最后一步的系统负责的数据提交? 可以考虑。 例如:一个业务从oss--->billing--->radius,那么oss和billing都不提交数据,只负责把这些数据保存到一个中间表(或者干脆保存sql语句),最后才由radius取中间表的信息,并统一提交数据,同时清空中间表。 在INFINET中,这种分布式事务并不多,所以可以考虑。3:能用TP Monitor中间件实现吗? 可行性不大。 因为如果用BEA 的 Tuxedo 、 IBM 的 CICS等实现的话,除了这些产品的价格不菲之外,我们的系统结构需要变化,而且也需要修改代码,对已有的系统做这样的变动不是个好消息。结论: 建议采用解决方法2
      

  2.   

    当前解决这种问题的通用方法就是MQ,MQ的工作原理参见文章最后。
    也就是当Billing提交数据到数据库后,会发送一个消息到MQ,然后Radius监控并接受这个消息,一直等到Radius接收并处理这个消息成功,如果处理不成功,MQ事务会回滚,而且Billing也能知道Radius有没有处理这条消息,参见下图:
    诸如一些TP Monitor中间件,如:BEA 的 Tuxedo及IBM的CICS;
    一些消息中间件MOM,如:IBM的MQSeries等都可以解决这个问题,但这些产品的价格不菲。如果不用这些商业产品的话,我们可用开源MQ(如:OpenJMS、UberMQ、ActiveMQ、MantaRay、JORAM)来来解决上述问题,但这个开源MQ必须有java、c、c++调用接口。
      

  3.   

    你的第2种方法,如果有很多并发的时候,可能还是有问题的吧.
    如果用webservice,最后对对象的2个conn引用commit或者rollback,是否更好一点呢