假设房屋有居住者,任何房屋的两个住户都不能有相同的高度。
听起来很简单,但是当50个线程同时尝试执行时,就会变得很复杂。我使用了UPDLOCK,即select (步骤2)上的行锁来阻止对我可能想更新的任何占居者的可能更新。然而,我偶尔会遇到一个失败,当没有当前的居住者,并且增加了一个新的占用者。故障始终是唯一的约束冲突。这不应该发生(参见第4步),但它确实发生了。
步骤2-5使用TransactionScope隔离级别在ReadCommitted中执行.
是否有一个最佳实践模型来定义这样的场景应该如何处理?
发布于 2013-03-16 02:56:20
看一看SQL Server中的事务隔离级别。听起来你的问题很可能是你有幻影读取(也就是说,有人在你已经选择‘’ed‘的范围内插入数据)。
在这种情况下具有高度并发性的情况下,我肯定建议您在单个事务中运行所有相关查询(即选择,后面跟着适当的INSERT/UPDATE/DELETE),隔离级别设置为Serializable。这样,Server将确保事务在完全隔离的情况下进行。
但是,在这种情况下,考虑到其高度并发性,最好的解决方案可能是在代码中实现某种类型的锁定/同步,而不是仅仅依靠SQL Server来帮助您。(尽管如此,我仍然建议使用可序列化的隔离级别。)
例如,使用某种类型的锁管理器,为每个占用者和每个房屋生成一个锁对象,这样您就可以始终为同一占用者(或房屋)获得相同的对象,并让每个线程使用该对象进入关键部分(或类似的C#'s Monitor.Enter) --只是要小心避免死锁。这样,您就可以保证在任何给定的时间,只有一个线程在检查任何特定的房子或任何特定的占用者,但仍然允许其他线程运行。
发布于 2013-04-05 22:21:47
我已经意识到这不是一个与SQL或TransactionScope相关的问题。我正在协调数据项的集合,在这种情况发生时,必须对集合的访问进行信号传递。在我的例子中,我只需要添加一个锁(列表){围绕进行协调的代码。}
为了继续这个类比,如果你要协调一份占用者的名单,最好是把门锁上,这样你就可以防止住客进进出出。
https://stackoverflow.com/questions/13754554
复制相似问题