我有一张发票表(以及一张带有ActiveRecord()
列的SubSonic'发票'InvoiceNumebr
,需要有唯一的数字。我正在GetTheNextAvailableNumber()
内TransactionScope
使用块。这有效。
我不确定的是,如果5个或50个不同的用户尝试在大约创建发票时会发生什么。同时,如果方法在以后保存发票对象,则该方法将为所有5或50个用户返回相同的数字。
在GetTheNextAvailableNumber()
块内调用的TransactionScope
方法使用带有MAX()
的Subsonic Select查询来获取最大数量,然后添加1.列本身确实具有UNIQUE索引!
交易的隔离级别默认(可序列化)是否确保每个都获得一个唯一的数字?或者是否有更聪明的机制来实现这一目标? 该列不能具有IDENTITY,因为PK列 InvoiceID 已经拥有它。
答案 0 :(得分:1)
你在谈论交易范围内的并发性 - 唯一可行的方法是在trannie执行时对表施加锁定......这可能会扼杀你的应用程序。
你有可能使用Guid吗?
答案 1 :(得分:0)
如果在db中构建第二个表并在该表中存储NextAvailableNumber
的值,该怎么办?然后,您将使用存储过程来检索该值并在同一调用中将其递增。您只需要锁定该存储过程以防止并发调用。您也可以将其锁定在存储过程中。