2017-09-15 67 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

有几种方法可以解决这个问题......我个人的偏好是使用类似于购物车的东西。用户加载他们的购物车(临时保留部分库存),然后检查出来,创建实际订单并减少实际库存......或者放弃购物车使这些物品可供其他购物者使用。

所以,我会创建一个表格,只是为特定会话保留一个特定的方框,并且不允许任何其他会话使用它,直到原始会话提交事务的最后一步(使其永久不可用)或回退可释放下一个用户的箱号。