我目前正在致力于一个网站,该网站允许潜在客户生成报价并购买保单。他们提交付款后,应用程序应该生成一个保单号码。管理/生成保单号码的最佳做法
我得到了一个政策号码块增量使用。对于这个例子,假设我们说0100800 - 0100999.如果我有两个或更多的人决定同时购买政策,有什么是最佳实践/算法,以确保我不会生成两个相同的政策编号或更多的人?
在最后一个可用的保单号码0100999之后,我可能会得到另一个保险单号码,例如0222100-0222399。
我目前正在致力于一个网站,该网站允许潜在客户生成报价并购买保单。他们提交付款后,应用程序应该生成一个保单号码。管理/生成保单号码的最佳做法
我得到了一个政策号码块增量使用。对于这个例子,假设我们说0100800 - 0100999.如果我有两个或更多的人决定同时购买政策,有什么是最佳实践/算法,以确保我不会生成两个相同的政策编号或更多的人?
在最后一个可用的保单号码0100999之后,我可能会得到另一个保险单号码,例如0222100-0222399。
你将不得不使用一个锁,锁定一个共享对象,得到你的id,增量。
另外,看看System.Threading.Interlocked.Increment,这一切,在一个单一的方法。
假设你不应该在用完的时候回到你的起始号码(在你的情况下是0100800),那么你可以使用一个SQL Server标识列,并将它作为起始预定义值并将其增加1.
我对此并不积极,但我认为你可以在Oracle中使用一个序列完成同样的事情,但我不确定的是如果你可以在预定义的数字中启动一个序列。
我假设您正在使用数据库来存储此信息?如果这是正确的(并且假设您正在使用SQL Server),则可以指定一列作为identity列。
一旦您指定它是你可以给它一个身份:
种子
是用于加载到表中的非常 第一行的值。
在你的情况下,它会是100800.你可以在从数据库中拉出它之前预置零。
这样做的好处是,您不必担心两个人在具有相同保单号的同一时间创建保单。
最好的想法是在数据库中执行此部分,因为您可以通过事务保护自己。
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
通常情况下,这取决于你将让你分配的最后一个ID存储。通常,这是一个数据库。在这种情况下,您只需要一个存储过程/命令组读取当前值,然后将其加1(以便下一次读取获得增加的值,等等)。
当然,你必须序列化访问这个,为此,你会把它包装在一个事务中。
现在,如果您使用的是其他存储介质,则需要以不同的方式对访问进行序列化。例如,对于文件,您必须锁定读取访问权限(并让其他进程旋转,直到它可以读取/写入独占访问权限),在内存中,您将使用锁定语句等。
开发者艺术几乎死亡。
虽然你应该包括错误检查和回滚。
和小问题...缺少@ DECLARE @LastPolicyNr诠释 SELECT LastPolicyNr = MAX(PolicyNr)FROM [政策]
但我会让它一步 DECLARE @NewPolicyNr诠释 SELECT @NewPolicyNr = MAX(PolicyNr)+1 FROM [Policy] WHERE ID> = [Your Min #In Your Block]
我想说大多数这些答案确实错过了最正确的答案。
你的情况最适合HI-LO密钥算法:What's the Hi/Lo algorithm?