提供一系列唯一编号(C#vs Sql)的好方法是什么?

提供一系列唯一编号(C#vs Sql)的好方法是什么?

问题描述:

我必须为我的应用程序的客户提供一个唯一的号码。 这是一个发票号码,所以它必须是唯一的,并且脱离线程安全。提供一系列唯一编号(C#vs Sql)的好方法是什么?

在过去,我创建了一个单例并使用了一个锁定语句:在锁定过程中,我将访问数据库并获取一个新数字,然后释放锁定。

有人告诉我,这也可以在SqlServer中完成,但在SqlServer中,我假设我也必须创建某种锁,因为sql代码(存储过程)可以并行执行,我也猜测。

所以,当我必须提供一个锁无论如何,它是否有所作为我可以在c#或Sql中做到吗?

+0

你可以在SQL中使用C#或uniqueidentifier中的Guid吗? – eugeneK 2011-06-15 07:55:18

+0

您可能感兴趣的这篇文章:http://*.com/questions/661998/oracle-sequence-but-then-in-ms-sql-server – forsvarir 2011-06-15 07:59:03

+0

请说清楚:你是否锁定了号码以保存它的唯一性,还是你将数字锁定到缓冲区的类型,如果它不是必需的,将数字返回? – NetRat 2011-06-15 07:59:19

在SQL Server中使用标识列:

-- Set up 
create table UniqueNumberGenerator (UN int identity primary key) 

-- Generate value 
insert into UniqueNumberGenerator default values 
select scope_identity() 

这是比获得一个表上的锁更快,更轻便。有关肮脏细节,请参阅here

如果您担心表中存在数千行,请不要担心,您可以定期从表中删除所有行,并且SQL Server仍会记住要生成的下一个值。如果需要,您可以使用dbcc checkident重置生成的值。

+0

迄今为止最好的方法+1。KISS等 – gbn 2011-06-15 08:00:17

+0

看起来对我来说是最好的答案 – 2011-06-15 08:00:49

+0

对于大数字情况下的删除+1 – Michel 2011-06-15 08:23:38

如果你能处理其可怕的样子,数据库的时间戳是线程安全的:SELECT @@dbts

(您可以修剪的前导零到有它看起来更像是一个可以接受的发票编号)

+1

请务必阅读关于'@@ dbts'的文档不会自行生成新代码。您必须在具有“TIMESTAMP”字段的表中插入一行。然后'@@ dbts'返回最近使用的值。 – Tony 2011-06-15 08:01:06

+0

你说得对。我使用一个有大量插入的生产数据库,所有时间表都带有时间戳列。这个背景远不是一个细节,当然,如果没有这样的背景,我的建议是完全不准确的。抱歉。 – Ssithra 2011-06-15 08:13:18

唯一的解决办法我知道可以可靠地产生唯一的数字是GUID数据类型。麻烦的是,这太长时间难以作为订单号使用。

使用数据库从identity字段获取下一个数字意味着您不必管理锁,只需执行插入操作,数据库将提供下一个数字。

当然,如果发票没有保存,该号码已被使用,现在“丢失”。如果这不妨碍你,那么我会用这种方法。在代码中做它是一种痛苦,再加上当你的应用程序的实例运行时会发生什么?你可以得到相同的编号。

+0

对于多个实例+1。 – Michel 2011-06-15 08:22:24