這個問題當然適用於更廣泛的範圍,但在這裏。在SQL Server中生成訂單號的正確方法
我有一個基本的電子商務應用程序,用戶可以很自然地下訂單。所述訂單需要有一個唯一的編號,我現在正在嘗試生成。
每個訂單都是供應商特定的。基本上,我有一個OrderNumberInfo (VendorID, OrderNumber)
表。現在,無論何時客戶下訂單,我都需要爲供應商增加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)
,悲觀鎖定等等,但就是無法適應所有這些在一個連貫的圖片:
- 這些提示如何發揮SQL Server 2008s的快照隔離?
- 它們是否執行行級,頁面級甚至表級鎖?
- 這如何容忍多個用戶試圖爲單個供應商生成數字?
- 什麼隔離級別適合在這裏?
- 一般來說 - 做這些事情的方法是什麼?
編輯
只是爲了讓一些事情更清晰:在應用程序中的這個特殊的角落
- 性能絕對不是一個問題:訂單會相對較少放置,將涉及一昂貴的電話給供應商的網絡服務,所以1秒的延遲是相當可以容忍的
- 我們真的需要讓每個供應商的訂單號碼爲b e獨立且連續
這很有趣!謝謝! – 2010-06-07 15:54:34
如果OrderNumber列表示最後使用的OrderNumber,那麼您是不是需要Inserted.OrderNumber? – Thomas 2010-06-07 16:33:12
@Thomas:我只是模仿問題中給出的代碼的行爲,它先獲取訂單號然後遞增列。但是如果你想增加,然後得到遞增的訂單號,那麼'INSERTED.OrderNumber'就是做這件事的方法。 – LukeH 2010-06-07 16:47:18