问题描述
|
我必须为我的应用程序的客户提供一个唯一的号码。
这是发票编号,因此必须唯一,并且线程安全。
在过去,我创建了一个单例并使用了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)