我想创建一个具有Department
和Maximum Capacity
列的SQL Server表(此情况下假设为10)。当用户将自己添加到部门时,系统将检查部门中的当前分配计数(对于此业务情景假设9)并将其与最大值进行比较。如果低于最大值,则会添加它们。
问题是这样的:如果两个用户同时提交,并且代码检索当前的分配计数时,两个用户都为9,该怎么办?一位用户更快地更新了该行,因此现在更新了它的10位,而另一位用户已经在更新之前检索了先前的值(9),因此在进行比较时都有效,我们最终在部门中拥有11位用户。
这甚至可能吗,怎么解决呢?
答案 0 :(得分:1)
问题的答案在于了解“数据库并发性”,然后为您的特定方案选择正确的解决方案。
主题太大,无法涵盖在一个SO答案中,因此,我建议您进行阅读并提出一些具体问题。
但是,以简单的形式,您要么将分配阻止给尝试获取分配的第一个人(悲观锁定),要么在有人尝试分配超出限制后抛出错误(乐观锁定)。
在悲观的情况下,如果用户未能完成交易,则您需要一些方法来解除阻止它们,例如超时。有点像在售票网站上说:“这些票将在接下来的10分钟内为您保留,您必须在这段时间内完成预订,否则可能会丢失它们。”
当您下降到最后几个位置时,您将在第一个离开之后转弯每个人……如果您需要这种级别的锁定,则没有其他选择。 (那么您可以创建一个等待列表,但这本身就是另一个问题)。