我目前在一个网站上工作,允许潜在客户生成报价和购买保单。在他们提交付款后,应用程序应生成保单编号。
我得到了一组保单号码,可以逐步使用。对于这个例子,我们假设是0100800 - 0100999。如果我有两个或更多的人同时决定购买一份保单,有哪些最佳实践/算法可以确保我不会为两个或更多的人生成相同的保单编号?
也有可能在最后一个可用保单编号0100999之后,我可能会得到另一个保单编号块,例如0222100-0222399。
发布于 2010-10-19 22:18:59
我想你是用数据库来存储这些信息吧?如果这是正确的(假设您使用的是SQL Server),则可以指定一列作为identity列。
一旦你指定它是一个身份,你可以给它一个:
种子
是用于加载到表中的第一行的值。
在你的情况下应该是100800。您可以在从数据库中拉出零之后将其放在前面。
这样做的一个好处是,您不必担心两个人同时创建具有相同保单编号的保单。
发布于 2010-10-19 22:18:55
假设您不打算在用完时返回到起始编号(在本例中为0100800),那么您可以使用SQL Server标识列,并将其作为起始预定义值的种子,并按1递增。
我对此并不乐观,但我认为你可以在Oracle中使用序列来完成完全相同的事情,我不确定的是,你是否可以从一个预定义的数字开始一个序列。
发布于 2010-10-19 22:19:09
最好的想法是在数据库中执行这一部分,因为在那里您可以通过事务来保护自己。
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 @NewPolicyNrhttps://stackoverflow.com/questions/3969286
复制相似问题