首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确管理Server中的集合

如何正确管理Server中的集合
EN

Stack Overflow用户
提问于 2012-12-06 23:32:50
回答 2查看 155关注 0票数 2

假设房屋有居住者,任何房屋的两个住户都不能有相同的高度。

  1. 随便挑一间房子
  2. 得到一份房屋当前住户的名单
  3. 通过检查列表来决定保留、替换、驱逐或添加哪些
  4. 确保新列表不包含任何高度相同的人。
  5. 用新列表替换现有列表;根据需要删除、插入或更新。

听起来很简单,但是当50个线程同时尝试执行时,就会变得很复杂。我使用了UPDLOCK,即select (步骤2)上的行锁来阻止对我可能想更新的任何占居者的可能更新。然而,我偶尔会遇到一个失败,当没有当前的居住者,并且增加了一个新的占用者。故障始终是唯一的约束冲突。这不应该发生(参见第4步),但它确实发生了。

步骤2-5使用TransactionScope隔离级别在ReadCommitted中执行.

是否有一个最佳实践模型来定义这样的场景应该如何处理?

EN

回答 2

Stack Overflow用户

发布于 2013-03-16 02:56:20

看一看SQL Server中的事务隔离级别。听起来你的问题很可能是你有幻影读取(也就是说,有人在你已经选择‘’ed‘的范围内插入数据)。

在这种情况下具有高度并发性的情况下,我肯定建议您在单个事务中运行所有相关查询(即选择,后面跟着适当的INSERT/UPDATE/DELETE),隔离级别设置为Serializable。这样,Server将确保事务在完全隔离的情况下进行。

但是,在这种情况下,考虑到其高度并发性,最好的解决方案可能是在代码中实现某种类型的锁定/同步,而不是仅仅依靠SQL Server来帮助您。(尽管如此,我仍然建议使用可序列化的隔离级别。)

例如,使用某种类型的锁管理器,为每个占用者和每个房屋生成一个锁对象,这样您就可以始终为同一占用者(或房屋)获得相同的对象,并让每个线程使用该对象进入关键部分(或类似的C#'s Monitor.Enter) --只是要小心避免死锁。这样,您就可以保证在任何给定的时间,只有一个线程在检查任何特定的房子或任何特定的占用者,但仍然允许其他线程运行。

票数 0
EN

Stack Overflow用户

发布于 2013-04-05 22:21:47

我已经意识到这不是一个与SQL或TransactionScope相关的问题。我正在协调数据项的集合,在这种情况发生时,必须对集合的访问进行信号传递。在我的例子中,我只需要添加一个锁(列表){围绕进行协调的代码。}

为了继续这个类比,如果你要协调一份占用者的名单,最好是把门锁上,这样你就可以防止住客进进出出。

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

https://stackoverflow.com/questions/13754554

复制
相关文章

相似问题

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