【问题标题】:Assign unique numbers in database when saving the form保存表单时在数据库中分配唯一编号
【发布时间】:2014-04-07 07:21:38
【问题描述】:

我有一个表单,您可以在其中创建订单,当您保存它时,会在数据库中(使用 oracle)检查最后一个订单号,并将下一个订单分配给当前保存的订单。我发现如果两个用户同时或相隔几秒钟保存新订单,由于连接速度的原因,我的应用程序无法为新创建的两个订单分配不同的号码。问题是两者都在同一时间签入最后分配的号码,并且两个订单都得到相同的号码..

我有一些想法,但它们都有优点和缺点..

  1. 在用户保存订单时让系统等待几秒钟并检查订单号。但是如果两者在同一时间保存,检查将在同一时间完成,我想我最终会遇到同样的问题..

  2. 让系统检查订单号(每次刷新树视图时都会运行检查)并查看它是否被复制,然后通过突出显示的树视图让用户知道它被复制了。但是,如果在支票之前为订单分配了任何文件,那么我最终会得到与分配的订单名称和内部编号不同的文件。..

  3. 让系统定期检查所有订单号并为其中一个重复的订单号提供新的订单号,但这里的文档与 #2 中的问题相同.. 并且还可能导致一些性能问题..

  4. 在用户请求新订单时分配订单号,而不是在用户保存订单时分配。我可以让系统与此解决方案一起执行解决方案 #1,并重新检查数据库中是否正在使用该号码,然后重新为其分配一个新号码。再一次,如果文件被分配,必须有人去解决这些问题。

  5. 一种可能阻止将文档分配给重复文件的方法是,用户只被允许放置一些信息,然后保存或应用它,它会重新检查 #1,然后如果它没有找到任何东西,允许用户添加文档。这部分解决方案可能适用于上述任何情况,但我不想在检查数字时延迟用户的工作。..

如果您发现上述想法有任何改进,或者您有新的想法,请告诉我。 我需要找到最好的解决方案,并且尽可能不影响用户当前的工作流程..

【问题讨论】:

  • 寻找SEQUENCE ?
  • 在生成新订单号时可以不使用锁定功能吗?因此,当用户创建新订单时,只需在创建时将其锁定。使用您的数据库的语句来检查锁,如果它已被锁定并正在使用,则创建另一个订单号。希望这是有道理的。

标签: c# vb.net oracle oracle11g unique


【解决方案1】:

如果您的订单 ID 只是一个数字,您可以使用 Oracle 序列。

CREATE SEQUENCE order_id;

在您保存记录之前获取一个新的订单号。

SELECT order_id.NEXTVAL FROM DUAL;

另见Oracle/PLSQL: Sequences (Autonumber)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多