提供一系列唯一数字C#与Sql的好方法是什么?

问题描述

| 我必须为我的应用程序的客户提供一个唯一的号码。 这是发票编号,因此必须唯一,并且线程安全。 在过去,我创建了一个单例并使用了lock语句:在锁定期间,我将进入数据库获取一个新的数字,然后释放该锁定。 某种东西告诉我,这也可以在sqlServer中完成,但是在sqlServer中,我认为我还必须创建某种类型的锁,因为sql代码(存储过程)也可以并行执行。 所以当我无论如何都必须提供锁时,无论是在C#还是在sql中进行操作,都会有所作为吗?     

解决方法

        在SQL Server中使用标识列:
-- Set up
create table UniqueNumberGenerator (UN int identity primary key)

-- Generate value
insert into UniqueNumberGenerator default values
select scope_identity()
与在表上获取锁相比,此方法更快,更轻便。请参阅此处了解肮脏的细节。 如果您担心表填充了数千行,请不必担心,您可以定期删除表中的所有行,SQL Server仍会记住要生成的下一个值。如果需要,可以用
dbcc checkident
重置生成的值。     ,        我知道的唯一可以可靠地独立产生唯一数字的解决方案是GUID数据类型。麻烦的是,这太长了,无法轻松用作订单号。 使用数据库从“ 2”字段中获取下一个号码意味着您不必管理锁,只需执行插入操作,DB便会提供下一个号码。 当然,如果未保存发票,则该号码已被使用,现在已“丢失”。如果那不打扰您,那么我将使用该方法。用代码来做是一件很痛苦的事情,加上在您的应用程序实例上运行的次数多时会发生什么?您可以生成相同的数字。     ,        如果您可以处理它的可怕外观,则数据库的时间戳是线程安全的:
SELECT @@dbts
(您可以修剪前导零以使其看起来更像是可接受的发票ID)