我有一个ASP.NET web应用程序,它有一个关键的位置,用户为自己保留一些号码。
所发生的是:
问题是,在1到3之间有一种可能性,即另一个用户也会这样做,并从未修改的表中读取3044,所以我需要从读取中用'last_box_number‘锁定表,但是如果第一个用户失败(断开连接或发生其他糟糕的事情),表将保持锁定。
我不太熟悉SQL Server的锁定机制,所以在超时之后,我需要一个有保证的锁释放。
无论如何,任何关于实施上述建议的最佳方式的建议都是值得欢迎的。
更新: OK,下面是一个示例:
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秒,那就没有问题了,但在那之后,他需要重新设置工作,并获得一个新的“最新数字”。
如果事先知道新记录的数量是很好的,但它可以不时变化,绝对必要的是这些参考数字是一致和独特的。
发布于 2017-09-15 18:32:50
有几种方法可以解决这个问题..。我个人的偏好是使用类似于购物车的东西。用户装载他们的购物车(暂时保留一部分库存),然后结帐,创建实际订单并减少实际库存.或者放弃手推车,让其他购物者可以买到这些东西。
因此,我会创建一个表,它只是将一个特定的框保留给特定的会话,并且不允许任何其他会话使用它,直到原始会话提交事务中的最后一步(使其永久不可用),或者回滚释放下一个用户的框号。
https://stackoverflow.com/questions/46242671
复制相似问题