首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保证释放的Server锁表

保证释放的Server锁表
EN

Stack Overflow用户
提问于 2017-09-15 15:08:34
回答 1查看 46关注 0票数 0

我有一个ASP.NET web应用程序,它有一个关键的位置,用户为自己保留一些号码。

所发生的是:

  1. 有一个存储“last_box_number”的表,即3044
  2. 应用程序读取这个数字并计算一些条形码,例如,它需要下一个100个数字,每个编号从3045到3144。
  3. 应用程序将这些数字与数据库中的其他数据一起存储,并将“last_box_number”更新到3144。这是在事务中执行的。

问题是,在1到3之间有一种可能性,即另一个用户也会这样做,并从未修改的表中读取3044,所以我需要从读取中用'last_box_number‘锁定表,但是如果第一个用户失败(断开连接或发生其他糟糕的事情),表将保持锁定。

我不太熟悉SQL Server的锁定机制,所以在超时之后,我需要一个有保证的锁释放。

无论如何,任何关于实施上述建议的最佳方式的建议都是值得欢迎的。

更新: OK,下面是一个示例:

代码语言:javascript
复制
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个数字(参考资料),所以他会查询sscc_numbers表并获得'lastnumber',例如6。

然后,它开始其业务,并产生10个新的SSCC号码与参考号码从7到16 (认为最后使用的号码是6)。完成后,他将这10个数字的相关数据插入到sscc表中。然后他运行update sscc_numbers set lastnumber=16 ...

现在我要避免的场景--想象第二个用户user2在user1繁忙时查询sscc_numbers,并从sscc_numbers获得相同的数字6。然后,在user2完成后,他将无法将数据插入到ssccs表中,因为他使用重复的引用号。

另一方面,User1可能会断开连接,处理数据的时间太长,等等。如果我将sscc_numbers表锁了10-15秒,那就没有问题了,但在那之后,他需要重新设置工作,并获得一个新的“最新数字”。

如果事先知道新记录的数量是很好的,但它可以不时变化,绝对必要的是这些参考数字是一致和独特的。

EN

回答 1

Stack Overflow用户

发布于 2017-09-15 18:32:50

有几种方法可以解决这个问题..。我个人的偏好是使用类似于购物车的东西。用户装载他们的购物车(暂时保留一部分库存),然后结帐,创建实际订单并减少实际库存.或者放弃手推车,让其他购物者可以买到这些东西。

因此,我会创建一个表,它只是将一个特定的框保留给特定的会话,并且不允许任何其他会话使用它,直到原始会话提交事务中的最后一步(使其永久不可用),或者回滚释放下一个用户的框号。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46242671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档