我在工作区A和工作区B有一个数据库。在线上有一个这个数据库的副本,它总是从这两个工作区更新。此外,每当另一个工作区做出任何更改时,两个工作区都需要更新其数据库。
一切都运行得很好,但我的问题是:例如,有两个表Stock和Orders,在Orders中有一列是stock_id。
如果工作区A创建具有自动递增的"stock_id"=23的新“股票X”,并且工作区B创建具有自动递增的"stock_id“= 23的新的”股票Y“,则工作区B将添加工作区A的”股票X“,并且工作区B将添加工作区B的”股票Y“,但每个工作区在每个数据库中都具有不同的id。
当工作区A在stock_id=23上订购“股票X”时就会出现问题,当此查询被发送到中央数据库,然后发送到工作区B时,它将插入订单,但stock_id = 23将引用“股票Y”。
我真的很感激在这方面能帮上忙谢谢:)
发布于 2012-04-15 17:44:18
我想到了这个答案,但我仍然感到困惑,如果它比上面的其他解决方案更好。工作区B中的所有查询都立即在本地数据库上执行,并发送到中央数据库,然后发送到工作区A,但是工作区A上的查询不会立即在本地数据库上执行,它们被发送到中央数据库,然后中央将它们发送到工作区B,当工作区B执行这些查询时,它会通知中央,然后通知工作区A,然后工作区A可以执行存储的查询。因此,允许工作区B正常执行其查询,但是仅当工作区A知道工作区B何时执行了这些查询时,才允许工作区A执行其查询,因为在工作区B执行A的查询之前,它发送自己的新查询,然后执行A的查询,因此在通知A B执行其查询之后,它检查B是否发送了它自己的任何新查询并执行它们,然后它执行它自己的查询。这样,所有自动递增的id在两个工作区中都是相同的。示例:
工作区A:
q1= insert into stock (name) values ('A') not executed
q2= insert into stock (name) values ('B') not executedA的数据库:(空)
工作区A将q1和q2发送到中心,并等待中心确认B已执行这些查询,以便它可以自己执行这些查询
工作区B:
q3= insert into stock (name) values ('C') executed id=1
q4= insert into stock (name) values ('D') executed id=2数据库B:(1,'C'),(2,'D')
工作区B在将q3和q4发送到中心后,会收到q1和q2的通知。
工作区B执行q1 & q2
q1= insert into stock (name) values ('A') executed id=3
q2= insert into stock (name) values ('B') executed id=4数据库B:(1,'C'),(2,'D'),(3,'A'),(4,'B')
工作区A被通知B已经执行了它的q1 & q2,但是它被告知必须先执行q3 & q4,然后才能执行q1 & q2
工作区A:
q3= insert into stock (name) values ('C') executed id=1
q4= insert into stock (name) values ('D') executed id=2
q1= insert into stock (name) values ('A') executed id=3
q2= insert into stock (name) values ('B') executed id=4B的数据库:(1,'C'),(2,'D'),(3,'A'),(4,'B')
https://stackoverflow.com/questions/10154953
复制相似问题