2010-10-19 38 views
0

我目前正在致力于一个网站,该网站允许潜在客户生成报价并购买保单。他们提交付款后,应用程序应该生成一个保单号码。管理/生成保单号码的最佳做法

我得到了一个政策号码块增量使用。对于这个例子,假设我们说0100800 - 0100999.如果我有两个或更多的人决定同时购买政策,有什么是最佳实践/算法,以确保我不会生成两个相同的政策编号或更多的人?

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

回答

0

你将不得不使用一个锁,锁定一个共享对象,得到你的id,增量。

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

1

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

我对此并不积极,但我认为你可以在Oracle中使用一个序列完成同样的事情,但我不确定的是如果你可以在预定义的数字中启动一个序列。

2

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

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

种子

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

在你的情况下,它会是100800.你可以在从数据库中拉出它之前预置零。

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

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 
0

通常情况下,这取决于你将让你分配的最后一个ID存储。通常,这是一个数据库。在这种情况下,您只需要一个存储过程/命令组读取当前值,然后将其加1(以便下一次读取获得增加的值,等等)。

当然,你必须序列化访问这个,为此,你会把它包装在一个事务中。

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

0

开发者艺术几乎死亡。

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

和小问题...缺少@ DECLARE @LastPolicyNr诠释 SELECT LastPolicyNr = MAX(PolicyNr)FROM [政策]

但我会让它一步 DECLARE @NewPolicyNr诠释 SELECT @NewPolicyNr = MAX(PolicyNr)+1 FROM [Policy] WHERE ID> = [Your Min #In Your Block]

0

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

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

相关问题