我有一個許可證密鑰/序列號的sql服務器表。 表結構是類似的東西;從序列號池中爲客戶端分配序列號
[
RecordId int,
LicenceKey string,
Status int (available, locked, used, expired etc.)
AssignedTo int (customerId)
....
]
通過我的ASP.NET應用程序,當用戶決定購買一個許可證接受按鈕,我需要保留該用戶的許可密鑰。 我的做法是一樣,從KeysTable 選擇頂部1 licenceKey其中狀態=可用 更新KeysTable設置狀態=鎖定 然後返回鍵返回給應用程序。
我擔心的是,如果兩個asp.net線程訪問相同的記錄並返回相同licencekey。 您認爲做這樣的作業的最佳做法是什麼?有這樣一個衆所周知的問題或模式嗎? 如果我需要使用lock()語句,哪裏可以使用?
我使用SQL Server 2005,用於數據訪問的存儲過程,一個數據層一BusinessLayer和Asp.Net GUI。
感謝
這完全不解決問題,他...他正在同一批次中執行選擇和更新,但由於他沒有任何類型的鎖定(就像使用可序列化的事務),沒有什麼能保證並行批次不會選擇相同的行。 – 2009-04-22 13:03:21
其實我打算在業務層中寫一個像GetNextAvailableKey這樣的靜態方法,該方法在數據訪問方法(如選擇鍵,更新密鑰等)周圍具有lock()塊。或者,我應該編寫一個帶有SERIALIZABLE隔離級別的GetNextKey存儲過程它會選擇,更新並返回該鍵,並在調用方法中添加一個lock()塊? – UmutKa 2009-04-22 13:11:40
對不起,我的答案有點不準確。請參閱編輯。 – Grzenio 2009-04-22 13:18:23