0

I've a simple client registration system that runs over a network. The system is supposed to generate a unique three digit ID (primary key) with the current year concatenated (e.g. 001-2013). However, I've encountered the problem that the same primary keys being generated when two users from different computers (over a LAN) try to register different clients.

What if the user cancels the registration after an ID is already generated? I've to reuse that ID for another client. I've read about static variable but it didn't solve my problem. I really appreciate your ideas.

4

2 回答 2

2

唯一和连续的 ID 很难实现。为了完全实现它,您必须序列化客户端信息的提交创建,以便仅在实际存储数据时生成 ID,否则当提交期间发生错误时,您最终会遇到漏洞。

如果您不需要严格的序列号 - 为每个系统提供 ID 范围(1-22、23-44、...)是常见的方法。如果您需要使用尽可能多的 ID,您可以给出要使用的 ID 列表({1,3,233,234},{235,236,237}),而不是范围。

于 2013-01-08T08:03:30.293 回答
2

问题:

  1. 新项目 -001 已创建,但尚未保存
  2. 新项目 -002 已创建,但尚未保存
  3. 项目 -001 已取消

ID -001 怎么办?

最简单的解决方案是在确定存储项目之前不分配 ID。

另一种方法是,当最终保存项目时,您查找第一个空闲 ID。如果第 2 步 (#2) 中的项目在第 1 步中的项目之前保存,则#2 的 ID 为 -001。当#1 被保存时,保存逻辑会看到其声明的 ID (-001) 正在使用中,因此它将分配 -002。所以ID被重新分配。

最后,您可以在创建新项目时轻松找到下一个免费 ID。在上述三个步骤中,这意味着您最初在 -001 应该存在的地方有一个间隙。如果您现在创建一个新项目,您的代码将看到 -001 未使用并将其分配给新项目。

但是,这完全取决于您没有指定的要求,现在 -001 的创建时间晚于 -002,我不知道这是否允许。此外,在任何给定时刻,您的编号中都可能有一个项目已被取消的空白。如果它发生在报告期末,这将导致错误(-033、-034、-036)。

您可能还希望包含一个自动递增的主键,而不是此发票编号或其他任何内容。

于 2013-01-08T08:05:03.747 回答