如果在服务器端生成唯一 ID,应用程序如何防止数据库中的重复条目

Posted

技术标签:

【中文标题】如果在服务器端生成唯一 ID,应用程序如何防止数据库中的重复条目【英文标题】:How do apps prevent duplicate entries in the database if the Unique ID is generated on the server side 【发布时间】:2022-01-19 18:45:22 【问题描述】:

考虑一个类似 facebook 的应用程序和以下操作序列:

    应用程序向服务器提交后期内容 服务器将 UUID 与该帖子内容相关联,并将帖子插入到 KV 存储中,以针对该密钥。服务器也成功了 服务器无法发送响应或由于服务器和应用程序之间的网络故障,应用程序无法获得响应 应用重试上传帖子。服务器重复步骤 1-2。这次成功进入KV-store的入口

此时,KV-store 有帖子的重复条目,用户将看到帖子的 2 个条目。

类似 Facebook 的应用程序如何解决这个问题。

我认为解决这个问题的唯一方法是让请求具有幂等性,并且只有当应用在重新提交相同的请求时重新使用相同的 ID 时才有可能。

【问题讨论】:

【参考方案1】:

我认为这完全取决于业务方面的考虑。 有时我们会在 Instagram 上上传多个内容相同的帖子,因此我们应该通过删除其他帖子来保留其中一个。如果存在不允许用户创建具有相同内容的多个数据的情况,那么他们应该会收到重复错误(409 status code)。这是我一直以来的解决方案。也许我没有理解你对这个问题的看法。

【讨论】:

如果“用户”想重新上传相同的帖子 2 次,我们应该允许它。但我的示例是关于移动应用程序在第一次失败时重试上传。在这种情况下,用户只上传了 1 次帖子,但它会在时间轴中显示 2 次,因为移动应用程序不小心插入了 2 次。服务器无法知道第二个帖子是对第一个帖子的重试并对其进行重复数据删除。它只会为第二次尝试创建一个新 ID 并插入一个新行,而不是返回 409 错误代码。这有助于解释我的例子吗?

以上是关于如果在服务器端生成唯一 ID,应用程序如何防止数据库中的重复条目的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 框架中如何使用 AOP 防止重复提交?

如何防止订单重复提交

利用Session防止表单重复提交

生成唯一 ID

分布式系统全局唯一ID生成器:Go 实现

Springboot 使用AOP实现防止接口重复提交