提供一系列唯一编号(C#vs Sql)的好方法是什么?
我必须为我的应用程序的客户提供一个唯一的号码。 这是一个发票号码,所以它必须是唯一的,并且脱离线程安全。提供一系列唯一编号(C#vs Sql)的好方法是什么?
在过去,我创建了一个单例并使用了一个锁定语句:在锁定过程中,我将访问数据库并获取一个新数字,然后释放锁定。
有人告诉我,这也可以在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()
这是比获得一个表上的锁更快,更轻便。有关肮脏细节,请参阅here。
如果您担心表中存在数千行,请不要担心,您可以定期从表中删除所有行,并且SQL Server仍会记住要生成的下一个值。如果需要,您可以使用dbcc checkident
重置生成的值。
唯一的解决办法我知道可以可靠地产生唯一的数字是GUID数据类型。麻烦的是,这太长时间难以作为订单号使用。
使用数据库从identity
字段获取下一个数字意味着您不必管理锁,只需执行插入操作,数据库将提供下一个数字。
当然,如果发票没有保存,该号码已被使用,现在“丢失”。如果这不妨碍你,那么我会用这种方法。在代码中做它是一种痛苦,再加上当你的应用程序的实例运行时会发生什么?你可以得到相同的编号。
对于多个实例+1。 – Michel 2011-06-15 08:22:24
你可以在SQL中使用C#或uniqueidentifier中的Guid吗? – eugeneK 2011-06-15 07:55:18
您可能感兴趣的这篇文章:http://*.com/questions/661998/oracle-sequence-but-then-in-ms-sql-server – forsvarir 2011-06-15 07:59:03
请说清楚:你是否锁定了号码以保存它的唯一性,还是你将数字锁定到缓冲区的类型,如果它不是必需的,将数字返回? – NetRat 2011-06-15 07:59:19