【问题标题】:Handle sale transactions when webapp goes offline在 webapp 下线时处理销售交易
【发布时间】:2011-07-02 18:25:03
【问题描述】:

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

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

当两个或更多分支机构失去互联网连接时,噩梦就会发生。因为当他们离线销售并且互联网恢复时,服务器会收到两个具有相同 ID 的销售,这太可怕了,因为客户票已经打印了!

我现在的计划是让每个销售 ID 混合分店 ID 和该分店的实际销售编号。所以分支 1 的销售 ID 将是 1-1,分支 2 的下一个销售将是 2-1。在一个分支有两个销售点之前听起来不错,但事实并非如此,但它不是很有未来的证明。

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

【问题讨论】:

    标签: javascript web-applications offlineapps


    【解决方案1】:

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

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

    哪种技术对您来说最实用取决于您的系统比您在此处描述的要多得多,因此您必须根据自己的知识进行选择,或者更多地描述您的系统如何为我们工作能够提供更多帮助。

    【讨论】:

      【解决方案2】:

      理想情况下,每个销售点都有自己的 ID。例如,我曾经在一家国际零售连锁店工作(这里不点名),该连锁店在全球拥有数千家分店,每个分店最多有 15 个销售点。每个 POS 都有自己的 ID 分配给它 - 它在向后端系统进行身份验证时使用此 ID。

      如果您的设置属于这种情况,那么您应该使用 POS ID 而不是分行 ID。这样,如果您在同一个分支机构有多个 POS,您可以将 POS ID 预先附加到交易 ID。

      【讨论】:

        【解决方案3】:

        您所描述的复合键是解决此问题的好方法。当我需要避免分布式情况下的键冲突时,我倾向于使用 GUID。

        【讨论】:

        • 在这种情况下,如果您使用 GUID(这很笨拙,而且通常人们讨厌使用它们),您只需要在客户端使用 GUID。客户端与服务器同步后,服务器可以分配适当的标识符以供将来使用。
        • @我会让计算机处理 GUID,它们比我快得多。如有疑问,我会在任何一天选择一个 GUID 而不是 int 作为 PK。当需要将来自 10 万个不同来源的数据混合在一起时,您会很高兴您没有使用全部从 1 开始的整数。
        猜你喜欢
        • 2018-03-24
        • 2015-10-07
        • 2012-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-10
        相关资源
        最近更新 更多