【问题标题】: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]