管理/生成政策号码的最佳做法

时间:2010-10-19 14:14:44

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

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

我获得了一个政策编号块,可以逐步使用。对于此示例,假设0100800 - 0100999.如果我有两个或更多人决定同时购买策略,有哪些最佳做法/算法可以确保我不为两个或两个生成相同的策略编号更多人?

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

7 个答案:

答案 0 :(得分:2)

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

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

  

种子

     

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

在你的情况下,它将是100800.你可以在从数据库中提取零之后添加零。

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

答案 1 :(得分:1)

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

我不是肯定的,但我认为你可以使用一个序列在Oracle中完成同样的事情,我不确定的是你是否能以预定义的数字开始一个序列。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

您必须使用锁定,锁定共享对象,获取您的ID,增加。

另外,看看System.Threading.Interlocked.Increment,它就是一个单一的方法。

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

开发者艺术几乎已经死了。

虽然您应该包含错误检查和回滚。

和小问题......错过了@ DECLARE @LastPolicyNr int SELECT LastPolicyNr = MAX(PolicyNr)FROM [Policy]

但我会迈出一步 DECLARE @NewPolicyNr int SELECT @ NewPolicyNr = MAX(PolicyNr)+1 FROM [Policy] WHERE ID> = [你的MIN#在你的区块内]

答案 6 :(得分:0)

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

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