【问题标题】:Best practice for managing/generating policy numbers管理/生成保单编号的最佳实践
【发布时间】:2010-10-19 14:14:43
【问题描述】:

我目前正在开发一个网站,该网站允许潜在客户生成报价并购买保单。在他们提交付款后,应用程序应生成一个保单编号。

我得到了一组保单号码,可以逐步使用。对于此示例,假设为 0100800 - 0100999。如果我有两个或更多人决定同时购买一份保单,有哪些最佳实践/算法可以确保我不会为两个或更多人生成相同的保单编号更多人?

也有可能在最后一个可用的保单号码 0100999 之后,我可能会得到另一组保单号码,例如 0222100-0222399。

【问题讨论】:

    标签: c# asp.net asp.net-mvc


    【解决方案1】:

    我假设您正在使用数据库来存储这些信息?如果这是正确的(假设您使用的是 SQL Server),您可以将一列指定为 identity 列。

    一旦你指定它是一个身份,你就可以给它一个:

    种子

    是用于非常的值 第一行加载到表中。

    在您的情况下为 100800。您可以在从数据库中提取零后添加零。

    这样做的一个好处是,您不必担心两个人在完全相同的时间创建具有相同保单编号的保单。

    【讨论】:

      【解决方案2】:

      假设您在用完时不应该返回起始编号(在您的情况下为 0100800),那么您可以使用 SQL Server 标识列并将其作为起始预定义值并递增 1 .

      我对此并不肯定,但我认为您可以在 Oracle 中使用序列完成完全相同的事情,但我不确定是否可以从预定义的数字开始序列。

      【讨论】:

        【解决方案3】:

        最好的办法是在数据库中执行这部分,因为您可以通过事务保护自己。

        SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
        BEGIN TRANSACTION
        
        DECLARE @LastPolicyNr int
        SELECT LastPolicyNr = MAX(PolicyNr) FROM [Policy]
        
        DECLARE @NewPolicyNr int
        SET @NewPolicyNr = @LastPolicyNr + 1
        
        INSERT INTO [Policy] ([PolicyNr], ...)
        VALUES (@NewPolicyNr, ...)
        
        COMMIT TRANSACTION
        END TRANSACTION
        
        RETURN @NewPolicyNr
        

        【讨论】:

          【解决方案4】:

          你必须使用锁,在共享对象上加锁,获取你的 id,递增。

          另外,看看 System.Threading.Interlocked.Increment,这一切都在一个单一的方法中。

          【讨论】:

            【解决方案5】:

            通常,这取决于您将保存您分配的最后一个 id 的存储空间。通常,这是一个数据库。在这种情况下,您只需要一个存储过程/一组命令来读取当前值,然后将其递增 1(以便下一次读取得到递增的值,依此类推)。

            当然,您必须序列化对此的访问,为此,您需要将其包装在事务中。

            现在,如果您使用其他存储介质,则需要以不同的方式序列化访问。例如,对于文件,您必须锁定读取访问权限(并让其他进程旋转直到它可以获得读/写独占访问权限),在内存中,您将使用锁定语句等,等等。

            【讨论】:

              【解决方案6】:

              Developer Art 快要死了。

              虽然你应该包括错误检查和回滚。

              还有一个小问题......缺少@ 声明 @LastPolicyNr int SELECT LastPolicyNr = MAX(PolicyNr) FROM [Policy]

              但我会迈出一步 声明@NewPolicyNr int SELECT @NewPolicyNr= MAX(PolicyNr) +1 FROM [Policy] WHERE ID >= [YOUR MIN #In Your Block]

              【讨论】:

                【解决方案7】:

                我会说这些答案中的大多数确实错过了最正确的答案。

                你的情况最适合 HI-LO 密钥算法:What's the Hi/Lo algorithm?

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-09-02
                  • 1970-01-01
                  • 2010-11-11
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多