这个问题当然适用于更广泛的范围,但在这里。
我有一个基本的电子商务应用程序,用户可以很自然地在其中下订单。所述订单需要有一个唯一编号,我现在正在尝试生成该编号。
每个订单都是特定于供应商的。基本上,我有一个 OrderNumberInfo (VendorID, OrderNumber)
table 。现在,每当客户下订单时,我都需要增加 OrderNumber
对于特定的供应商并返回该值。自然,我不希望其他进程干扰我,所以我需要以某种方式专门锁定这一行:
begin tranaction
declare @n int
select @n = OrderNumber
from OrderNumberInfo
where VendorID = @vendorID
update OrderNumberInfo
set OrderNumber = @n + 1
where OrderNumber = @n and VendorID = @vendorID
commit transaction
现在,我已经阅读了
select ... with (updlock rowlock)
,悲观锁定等,但不能将所有这些放在一个连贯的图片中:编辑
只是为了让一些事情更清楚:
最佳答案
您的解决方案将在 OrderNumberInfo
上造成潜在的性能瓶颈。 table 。
订单不能简单地作为身份列,可能在应用程序端以供应商 ID 为前缀(例如 MSFT-232323)是否有任何具体原因?
这种方法的唯一缺点是每个供应商的订单不会是“添加 1 到获取下一个订单-#”模式,但我不知道为什么会出现任何技术或业务考虑一个问题,尽管它可能会使按顺序处理的顺序稍微复杂一些。
它们仍然会增加并且每个供应商都是唯一的,这是订单 ID 的唯一真正要求。
当然,假设您曾经拥有任何独立于供应商的逻辑,它当然会具有额外的附带好处——例如应用程序范围的 QC/报告。
关于sql-server-2008 - 在 SQL Server 中生成订单号的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2990883/