2017-09-15 64 views
0

我有一個ASP.NET Web應用程序,它有一個用戶爲自己保留一些數字的關鍵點。保證版本的SQL Server鎖定表

什麼情況是:

  1. 還有就是「last_box_number」存儲表,即3044

  2. 應用程序讀取這個數字,並計算了一些條形碼與它,例如,它需要在未來100個數字,每個編號從3045到3144.

  3. 應用程序將這些數字與附加數據存儲在數據庫中,並將'last_box_number'更新爲3144.這是在事務中執行的。

的問題是,1之間),3)有可能另一個用戶會做同樣的,並會從未修改表讀3044,所以我需要從讀鎖與「last_box_number」表,但如果第一個用戶失敗(斷開連接或發生其他任何不良事件),表格將保持鎖定狀態。

我對SQL Server鎖定機制並不是很熟悉,所以我需要一段時間後保證釋放鎖。

無論如何,最好的方式來實現上述任何意見是值得歡迎的。

UPDATE: 好了,下面是一個例子:

CREATE TABLE [dbo].[sscc_numbers](
[gs1prefix] [bigint] NOT NULL PRIMARY KEY, 
[rangestart] [int] NOT NULL, 
[lastnumber] [int] NOT NULL) 

CREATE TABLE [dbo].[ssccs](
[id] [bigint] IDENTITY(1,1) NOT NULL, 
[sscc] [nvarchar](20) NOT NULL, 
[clientid] [nvarchar](50) NOT NULL, 
[referencenum] [int] NOT NULL, 
... other fields 

一個USER1希望預訂10號(referencenum)讓他查詢sscc_numbers表,並獲得 'lastnumber',例如6

然後它開始其業務並生成10個新的SSCC號碼,參考號碼從7到16(認爲最後使用的號碼是6)。完成後,他將這10個數字的相關數據插入到sscc表中。然後,他跑update sscc_numbers set lastnumber=16 ...

現在我想避免的場景 - 想象第二個用戶user2的查詢sscc_numbers而user1的忙,並得到來自sscc_numbers相同數量的6。然後,在user2完成後,他將無法將他的數據插入到ssccs表中,因爲他使用了重複的參考數字。

另一方面,User1可能會斷開連接,處理數據的時間過長等。如果我將sscc_numbers表鎖定了10-15秒(這不會成爲問題),但在此之後,他需要重置他的工作並得到一個新的'lastnumber'

如果事先知道新記錄的數量,但它可能會不時變化,而且這些參考數字是一致且唯一的,這是絕對必要的。

+0

對我來說,似乎應該有不涉及您的鎖在表的所有替代的解決方案。但我不能完全理解你的要求,以使我能夠回答。如果您可以添加一個簡單的示例,併爲表和虛擬數據添加一些架構,我會詳細介紹一下。 – Tanner

+1

一旦這些值被保留,它們可以不被保留?如果發生這種情況會發生什麼?是否應該再次提供,或者將來會被忽略,讓您在箱號列表中留下空白? – Tanner

+2

如果我們排除更多的信息更好的解決方案的可能性,那麼你最有可能尋找應用程序鎖定([互斥(https://en.wikipedia.org/wiki/Semaphore_(編程)#Semaphores_vs._mutexes)) 。本指南適用於SQL Server 2005的,但過程是相同的:應用程序鎖定(或互斥)在SQL Server 2005 - 姆拉登Prajdić(http://www.sqlteam.com/article/application-locks-or-mutexes -in-SQL服務器-2005),和[**'sp_getapplock' ** - 文檔](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp -getapplock-的Transact-SQL) – SqlZim

回答

0

有幾種方法可以解決這個問題......我個人的偏好是使用類似於購物車的東西。用戶加載他們的購物車(臨時保留部分庫存),然後檢查出來,創建實際訂單並減少實際庫存......或者放棄購物車使這些物品可供其他購物者使用。

所以,我會創建一個表格,只是爲特定會話保留一個特定的方框,並且不允許任何其他會話使用它,直到原始會話提交事務的最後一步(使其永久不可用)或回退可釋放下一個用戶的箱號。