【发布时间】:2018-12-11 19:37:34
【问题描述】:
我想创建一个包含 Department 和 Maximum Capacity 列的 SQL Server 表(在这种情况下假设为 10)。当用户将自己添加到部门时,系统将检查部门中当前的分配计数(假设为 9)并将其与最大值进行比较。如果低于最大值,它们将被添加。
问题是这样的:如果两个用户同时提交,当代码检索到当前分配计数时,这两个用户都将是 9。一个用户更新该行的速度更快,所以现在它是 10,但另一个用户已经在更新 (9) 之前检索了以前的值,因此在比较时两者都是有效的,我们最终在部门中有 11 个用户。
这甚至可能吗?如何解决?
【问题讨论】:
-
您是否考虑过设置约束以阻止该值大于 10?考虑到当
UPDATE运行时会有一个锁,第二个UPDATE将不得不等待另一个完成。然后,第二个UPDATE将由于约束而失败。 -
有两种基本方法。 1) Larnu 指出,您可以创建数据库约束,但这不是一个非常动态的选项,并且仍然可能存在并发问题。 2)可以锁定表直到事务完成;如果需要,这可能是我会走的路。看看这个:stackoverflow.com/questions/25273157/…
-
您的意思是在执行第一次更新时检查值是否已达到 10,如果已达到,则向该部门添加锁,以便将来的更新无法执行更新?
-
不要设置
=10,使用+=1。 -
@DaleBurrell 我做到了,但这不是一个简单的并发,可以通过乐观或悲观并发来解决,因为我检查另一列并且软件正在动态存储值。总之谢谢
标签: sql sql-server tsql concurrency