Javascript 当webapp离线时处理销售交易

Javascript 当webapp离线时处理销售交易,javascript,web-applications,offlineapps,Javascript,Web Applications,Offlineapps,我的web应用程序(销售点)处理多个分支机构的销售。每个销售都有一个唯一的整数ID。分支1上的某个销售ID为n,那么分支2上的下一个销售ID为n+1 当分行失去互联网连接时,我会将销售信息保存在浏览器内部数据库中,其中销售ID是最后一个销售ID加上一个。恢复连接后,我会将该信息发送到服务器,然后将其存储在真实的数据库中 当两个或多个分支失去互联网连接时,噩梦就会发生。因为当他们离线销售,而互联网又重新打开时,服务器将收到两个具有相同ID的销售,这很可怕,因为客户票据已经打印出来了 我现在的计划是

我的web应用程序(销售点)处理多个分支机构的销售。每个销售都有一个唯一的整数ID。分支1上的某个销售ID为n,那么分支2上的下一个销售ID为n+1

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

当两个或多个分支失去互联网连接时,噩梦就会发生。因为当他们离线销售,而互联网又重新打开时,服务器将收到两个具有相同ID的销售,这很可怕,因为客户票据已经打印出来了

我现在的计划是,将每个销售ID与分支机构ID和该分支机构实际销售编号进行混合。因此分支1的销售ID将是1-1,分支2的下一次销售将是2-1。在分支机构有两个销售点之前,这听起来不错,但事实并非如此,但这并不是未来的证明


你认为什么是最好的方法?有更好的方法吗?

如您所述的复合键是解决此问题的好方法。当我需要在分布式环境中避免密钥冲突时,我倾向于使用GUID。

理想情况下,每个销售点都有自己的ID。例如,我曾为一家国际零售连锁店工作(此处不命名),该连锁店在世界各地有数千家分支机构,每个分支机构最多有15个销售点。每个POS都分配了自己的ID,并且在对后端系统进行身份验证时使用了该ID


如果您的设置是这样的,那么您应该使用POS ID,而不是分支机构ID。这样,如果您在同一分支机构中有多个POS,您可以将POS ID预先挂起到事务ID。

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

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


像这样的技术对您来说最实用取决于比您在这里描述的更多的系统,因此您必须根据您的知识进行选择,或者更多地描述您的系统如何工作,以便我们能够提供更多帮助。

在这种情况下,如果您使用GUID(这些都很笨拙,通常人们都不愿意和他们一起工作),您只需要在客户端使用GUID。一旦客户端与服务器同步,服务器就可以为将来使用分配适当的标识符。@我会让计算机处理GUID吗,它们比我快得多。如果有疑问,我会选择GUID而不是int作为PK。当需要将10中的数据混合在一起时在数千种不同的来源中,您会非常高兴您没有使用从1开始的Int。