我想创建一个SQL Server表,该表有一个Department
列和一个Maximum Capacity
列(在这种情况下假设为10列(。当用户将自己添加到部门时,系统将检查部门中的当前分配计数(在这种情况下假设为9(,并将其与最大值进行比较。如果低于最大值,则会添加它们。
问题是:如果两个用户同时提交,当代码检索到当前分配计数时,两个用户的分配计数都将为9。一个用户更新行的时间更快,所以现在是10,但另一个用户在更新之前已经检索到了以前的值(9(,因此两者在比较时都是有效的,我们最终在部门中有11个用户。
这可能吗?如何解决?
问题的答案在于理解"数据库并发",然后根据您的特定场景选择正确的解决方案。
这是一个太大的话题,无法在一个SO答案中涵盖,所以我建议你读一些书,然后带着具体的问题回来。
然而,在简单的形式中,你要么将分配阻止给第一个试图获得分配的人(悲观锁定(,要么在有人试图超过限制分配后抛出错误(乐观锁定(。
在悲观的情况下,如果用户未能完成事务(例如超时(,则需要解锁它们的方法。有点像订票网站上说的"这些票将在接下来的10分钟内为您保留,您必须在这段时间内完成预订,否则您可能会丢失它们"。
当你进入最后几个位置时,你会在第一次离开后让所有人都失望。。。如果您需要这种级别的锁定,则没有其他方法。(好吧,你可以创建一个等待名单,但这本身就是另一个问题(。