我目前正在开设一个网站,允许潜在客户生成报价并购买政策。在他们提交付款后,应用程序应生成一个策略编号。
我获得了一个政策编号块,可以逐步使用。对于此示例,假设0100800 - 0100999.如果我有两个或更多人决定同时购买策略,有哪些最佳做法/算法可以确保我不为两个或两个生成相同的策略编号更多人?
也可能在最后一个可用的保单号0100999之后,我可能会获得另一个保单号码块,例如0222100-0222399。
答案 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?