【问题标题】:Whats the best way to generate OrderId for Bank Transactions?为银行交易生成 OrderId 的最佳方法是什么?
【发布时间】:2012-03-04 05:32:33
【问题描述】:

我需要生成一个不带任何前导零的 9 位订单 ID。最好的方法是什么?

我想到的是:创建一个具有唯一 ID 列的表,然后在 C# 代码中生成一个介于 100000000 和 999999999 之间的随机数,并尝试将其插入表中,直到我成功为止。在此获得唯一约束异常并重新生成数字的机会是多少?

如果我的想法是正确的,有没有办法在 sql server 本身中执行此操作,而不是在 C# 代码中处理异常然后重新生成?

或者还有其他最好的方法吗?

谢谢

【问题讨论】:

  • 你为什么要一个非顺序的订单标识符,似乎是在浪费时间而没有任何好处!
  • 在所有银行进行在线交易时,我从未见过这样的OrderId:100000000
  • 从未见过超过 2 或 3 个零,如果我应用自动增量,对于前 9999 笔交易,我将获得一个包含四个连续零的 OrderId,这就是我想要随机 OrderId 的原因。
  • 嗯......当你的随机函数吐出 500000000 时你会怎么做?
  • 这就是为什么我在这里问一个问题以获得意见。我不知道,但你见过这样的订单编号吗?比如500000000

标签: c# sql-server-2008 random unique-key onlinebanking


【解决方案1】:

如果您的目标是生成看似随机的唯一交易 ID,我建议使用来自交易所有者 (userid) 的部分和来自交易本身的部分,并将它们组合起来以生成您的唯一交易 ID。如果这不可能,那么我建议将 GUID 转换为小数。这是如何做到的: Converting System.Decimal to System.Guid

【讨论】:

    【解决方案2】:

    如果您有令人信服的理由希望 ID 以随机顺序排列,也许您可​​以用 C# 编写一个一次性实用程序来生成随机数字列表并将它们插入 SQL 表中。然后,当您的程序需要一个 ID 时,它可以从该表中选择下一个可用的 ID。当然,您需要一个位字段或其他东西来标记已使用的 ID。您可能希望将选择和标记操作放入存储过程中,并让该过程在表工作时锁定表,以便同时处理的进程在有机会将其标记为已使用之前不会获得相同的 ID。

    【讨论】:

    • 9 亿行?是啊,为什么不呢,让我们开始吧。
    【解决方案3】:

    您可以在 SQL Server 中使用标识种子功能并定义起始值http://msdn.microsoft.com/en-us/library/aa933196(v=sql.80).aspx

    【讨论】:

      【解决方案4】:

      生成...直到我成功。

      嗯。如果您的交易数量与所有可能性相比保持相对较低,它甚至可能会起作用,但这似乎真的是错误的。捕获异常并重试?

      你有什么理由不使用自动增量键,从 100000000 开始并计数?

      【讨论】:

      • 如果我希望 OrderID 不按顺序排列,那么?
      • 抱歉,我想不出一个足够好的理由来避免这里出现连续数字并使我们的生活复杂化。通过默默无闻的安全性?
      • 嗯,您知道您可能在法律上必须保持它们的顺序吗?发票和会计行必须编号,并且在我所知道的几乎所有司法管辖区中,这必须是非随机的 - 因此可以测试分类帐是否完整。请注意,一些伪随机序列非常适合这里 - 快速,不是随机的,但足够随机,以至于人们不会设置 enxt 数。如果我是你,我会在这里与律师交谈 - 并确保你不要编写无用的软件。
      猜你喜欢
      • 2017-02-28
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      • 1970-01-01
      相关资源
      最近更新 更多