2011-07-02 32 views
1

我的web应用程序(销售点)处理多个分支机构的销售。每个销售都有一个唯一的整数ID。分支1上的某些销售ID为n,则分支2上的下一个销售为n +1。当webapp离线时处理销售交易

当分支机构失去互联网连接时,我将销售信息保存在浏览器内部数据库中,其中销售ID是最后一个销售ID加1。当连接恢复时,我将该信息发送给服务器,然后将其存储在真实数据库中。

当两个或更多分支机构松动互联网连接时会发生噩梦。因为当他们在离线销售和互联网回来时,服务器将获得两个具有相同ID的销售,这是非常可怕的,因为客户票据已经打印完毕!

我现在的计划是将每个销售ID从分行ID和该分行的实际销售编号混合在一起。所以分支1销售ID将是1-1,并且分支2的下一个销售将是2-1。听起来不错,直到布拉克有两个销售点,情况并非如此,但它不是很有前途的证据。

您认为最好的方法是什么?有没有更好的方法来做到这一点?

回答

1

唯一真正安全的避免ID冲突的方法是让服务器始终分配ID。如果POS机脱机,那么您可能需要分配本地和临时ID以在本地记录销售,然后当POS重新联机时,您可以从服务器获取真实ID并在发送事务之前将本地ID修改为真实ID 。我曾经有一个系统使用负数来表示客户端创建的ID和服务器创建ID的正数。当服务器收到负面的ID时,它会将其更改为唯一创建的服务器ID并将该ID返回给客户端,以便客户端可以使用真实的事务ID更新其数据库。

如果您希望/需要全局唯一的客户端定义的ID,则每个POS客户端都需要一个服务器分配的uniqueID,该ID可以是多部分化合物ID的一部分。然后,每个客户端可以维护自己的计数器,当它与唯一的客户端ID结合使用时,它始终是全球唯一的ID。它是您的branchID概念的扩展,除了它是唯一分配给每个客户端的clientID,因此您可以在每个分支上拥有多个POS客户端。分配clientID既可以在客户端安装时手动完成,也可以通过在某些设置或初始化过程中向服务器请求唯一的clientID来更动态地完成。

这样的技术对你来说最实用取决于你的系统比你在这里描述的要多得多,所以你要么根据你的知识来选择,要么描述你的系统如何工作我们能够帮助更多。

0

你所描述的复合键是解决这个问题的一个很好的解决方案。当我需要避免分布式情况下的关键冲突时,我倾向于使用GUID。

+0

在这种情况下,如果您使用GUID(这很不明智并且通常人们不愿意使用它们),您只需要在客户端使用GUID。一旦客户端与服务器同步后,服务器就可以分配适当的标识符供将来使用。 –

+0

@我会让计算机处理GUID,它们比我快得多。如果有疑问,我会选择一个GUID作为PK的任何一天。当需要将来自数千个不同来源的10个数据混合在一起时,您会非常高兴您没有使用从1开始的整数。 – ScottS

1

理想情况下,每个销售点都有自己的ID。例如,我曾经为一家国际零售连锁店工作(不会在此列出),在全球各地拥有数千家分支机构,每家分店最多有15个销售点。每个POS都有自己的ID分配给它 - 并且在对后端系统进行认证时使用了这个ID。

如果您的设置是这种情况,那么您应该使用POS ID代替分支ID。这样,如果您在同一分支中有多个POS,则将POS ID预先挂起到交易ID。