C#并发应用程序 - 独特的自定义生成的ID

时间:2018-05-05 15:26:18

标签: c# sql-server entity-framework

我正在开发一个ASP.Net应用程序,它本身并不是一个真正的分布式应用程序,但在某些时候会将所有数据同步到主节点。

为了能够将来自不同节点的数据存储在一个唯一的表中 没有ids的整理,采取的方法是:

  • 予。不使用自动生成的ids
  • II。行Id将由 NodeId + NextRowtId
  • 的串联组成

NextRowId 由以下人员生成:

  1. 从一个特定节点中选择最高ID
  2. 将其拆分为两部分,第一部分是 NodeId ,第二部分是 LastDocumentId
  3. 增加 LastDocumentId
  4. NodeId 与递增的 LastDocumentId
  5. 连接起来

    例如
    Id = 20099,拆分为( NodeId = 200, LastDocumentId = 99)

    LastDocumentId + 1 = 100

    NextRowId = 200100

    这在理论上是完美的,或者如果请求是按顺序处理的。但是,如果同时处理多个请求,则它们通常最终会生成相同的ID。

    所以在实践中,当多个用户尝试同时更新同一个表时,如果存在多个id冲突。

    Id colision in case of concurrent use

    我已经了解了为分布式系统生成唯一ID的最佳实践。然而,在这个时间点,它们都不是一个可行的选择,因为它们需要重新思考整个架构以及大量的重构。两者都需要时间,管理层不允许我这样做。

    那么我可以通过其他方式确保生成的ID是唯一的,还是以顺序方式处理请求?所有这些,理想情况下无需重组应用程序或导致性能瓶颈。

1 个答案:

答案 0 :(得分:2)

在您的键列上创建unique constraint。如果您碰巧两次插入相同的ID,请捕获异常并重新生成您的ID。

您可能希望改为使用Guids

也就是说,如果您需要知道您的数据与哪个节点相关联,那么根据它为您的数据库建模:有2列NodeIdDocumentId。您还可以在多列之上生成唯一约束。