假设房屋有居住者,并且任何房屋的两个居住者都不能具有相同的高度。
- 随机选择房子
- 获取房屋当前居住者的列表
- 通过检查列表来决定保留、替换、驱逐或添加哪些
- 确保新列表不包含任何相同高度的居住者。
- 用新列表替换现有列表;根据需要删除、插入或更新。
听起来很简单,但是当您有 50 个线程都试图同时执行此操作时,它会变得复杂。我在选择(步骤 2)上使用了 UPDLOCK、ROWLOCK 来阻止对我可能想要更新的任何居住者的可能更新。但是,当没有当前居住者并添加了新居住者时,我偶尔会失败。失败始终是唯一的约束违规。这绝不应该发生(参见步骤 4),但它确实发生了。
步骤 2-5 正在使用 ReadCommitted 隔离级别在 TransactionScope 内执行。
是否有一个最佳实践模型来定义应该如何处理这样的场景?