A,B两个相对独立的系统,A系统和B系统有相同的单据,两个系统相同的单据信息要同步,现A系统要修改单据状态,必须先发送SCOKET信息到B系统,B系统修改对应的单据状态后再返回成功的信息给A系统,A系统再修改单据状态
    但如果B系统修改单据状态后,A系统没有收到返回信息,两个系统的单据状态就不一致,请问有什么办法保证数据同步?
   (A,B两个系统是不同公司的系统,只能通过发送指令让对方作出修改)

解决方案 »

  1.   

    A在收到返回信息后,再发送个收到的信息给B,B若在规定的时间内未收到此信息就再次发送修改成功信息给A
    直到B收到信息....你也可以规定最大重试次数,超出此次数B则回滚修改的信息
      

  2.   

    1,A-->B 发送请求,A要修改单据状态;
    2,B受到请求,修改单据,但不提交,B-->A返回信息,等待A的回复.
    3,A受到请求,修改单据状态,提交;返回信息给B,B受到信息,提交;B要是由于等待超时还没受到A的返回信息.B回滚,同时再发送信息给A让其再回复修改前的状态.
    4,A若受到B发送的恢复修改前状态,则恢复.失败;A若没有受到B发送的恢复修改前状态信息,成功;
      

  3.   

    每次发送问题都配备一个唯一id,如果没收到回复,则重复发送相同的问题(相同的id),尝试n次失败后退出.
      

  4.   

    答:楼主的问题,认真考量起来,是比较复杂的.你知道基于TCP的RMI为了解决类似这样的"调用语义"问题,化了多大的心血呵.
    你的问题,不存在完美的解决方案,只能是尽可能理想的折中方案.
    楼主是基于TCP的SOCKET,因而一要过多考虑TCP协议本身已经解决的问题(TCP本身通信是可靠的).因此:我的建议是:你的应用层的双方同步协议可基于这一前提条件来设计:
    1)A->B发消息(命令),带有唯一的消息ID,(消息ID是递增的--这很重要-见下边说明)
    2)B收到后,立即响应消息(用相同的ID),并同时做数据更新
    3)A收到响应后,对该ID所对应的数据进行更新.
    讨论:
    若A没有收到响应消息:问题可能出在两处:(1)B没有收到--当然无法响应  (2)B收到,做了响应,但A没有收到.
    无论哪一种情况:A在指定的定时器时间内,没有收到ID消息的响应,都向B重发.若经过指定次数之后,仍没有收到响应,则B可能断电(之类)的了.此时:A的数据都不更新,必须等到B的响应,才能更新对于B:若是上述的第(1)种情况,则A的重发的命令,对于B,其实是新的,因而:B收到后,立即响应消息(用相同的ID),并同时做数据更新. 若是上述的第(2)种情况(即:B实际上已更新过了数据了),则A的重发的命令,对于B,就是一个真正的重发的命令了,B如何才能知道:A的这个命令是一个重发的命令?消息ID!由于假设消息ID是递增的,因此:B只要记隹最新更新数据成功的那个最大的消息ID就行了.当A的消息ID<这个已成功的最大消息ID时,B就认为这是一个重复的消息(即:B立即知道这是它的响应A没有收到而重发的),因此:此时B不能再更新数据(再更新就不对了),只是重发响应消息就行了.B要处理的麻烦事是:收到A的命令,且已响应了,而且响应的消息A也已收到了,但就是它自己的数据库更新数据时,老是出错!这时尽管消息处理上同步了,但实际数据上仍不是一致的.
      

  5.   

    或者是A要处理的麻烦事是:响应的消息A也已收到了,这时A在自己的数据库更新数据时,老是出错!这时尽管消息处理上同步了,但实际数据上A与B仍不是一致的. 
      

  6.   

    主要就是要设置retry的机制。如果a收不到b过来的成功信息就不停的询问b,
    当然要设置retry的次数和timeout时间。
      

  7.   

    十分感谢jiangnaisong详细解答,也想不到比你的方法更好的方法了