2009-08-25 76 views
2

我都需要具有唯一编号的发票表(和亚音速的“发票” ActiveRecord()InvoiceNumebr列。我使用的块试图GetTheNextAvailableNumber()TransactionScope的。这工作。的TransactionScope,选择采用亚音速

我不确定的是,如果有5个或50个不同的用户在大约同一时间尝试创建发票,会发生什么情况,如果所有5个或50个用户不保存,则该方法会返回相同的数字发票对象,直到更晚

TransactionScope块内调用的GetTheNextAvailableNumber()方法使用亚音速选择查询w ith MAX()以获得最大数量,然后添加1.该列本身具有UNIQUE索引!

交易的隔离级别默认(可序列化)确保每个人都得到一个唯一的数字?还是有更聪明的机制来实现这一目标? 该列不能有IDENTITY,因为PK列InvoiceID已经拥有它。

回答

1

你在谈论的是事务跨度的并发性 - 这种工作的唯一方法是在trannie执行时抛出一个锁,并且...可以终止你的应用程序。

是否有机会使用Guid?

+0

感谢罗布, 我在考虑使用Guid作为表的主键,但是,对于发票号码,我需要一个格式良好,可读的数字(int或带前导零的bigint,如0000000191)。 我想使用Guid作为PK会让我使用发票数字列中的IDENTITY ...是否正确? – John 2009-08-26 11:15:07

0

如果你在你的数据库中建立第二个表,并在该表中存储NextAvailableNumber的值,该怎么办?然后,您将使用存储过程来检索该值并在同一个调用中增加它。您只需要锁定该存储过程以防止并发呼叫。您也可以在存储过程中锁定它。