我有一个ASP.NET Web应用程序,它有一个用户为自己保留一些数字的关键点。保证版本的SQL Server锁定表
什么情况是:
还有就是“last_box_number”存储表,即3044
应用程序读取这个数字,并计算了一些条形码与它,例如,它需要在未来100个数字,每个编号从3045到3144.
应用程序将这些数字与附加数据存储在数据库中,并将'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'
如果事先知道新记录的数量,但它可能会不时变化,而且这些参考数字是一致且唯一的,这是绝对必要的。
对我来说,似乎应该有不涉及您的锁在表的所有替代的解决方案。但我不能完全理解你的要求,以使我能够回答。如果您可以添加一个简单的示例,并为表和虚拟数据添加一些架构,我会详细介绍一下。 – Tanner
一旦这些值被保留,它们可以不被保留?如果发生这种情况会发生什么?是否应该再次提供,或者将来会被忽略,让您在箱号列表中留下空白? – Tanner
如果我们排除更多的信息更好的解决方案的可能性,那么你最有可能寻找应用程序锁定([互斥(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