0

我们正在开发一个曾经作为单实例应用程序工作的 C# 应用程序。现在我们需要将其更改为多用户应用程序,这意味着 GUI 前端将在多个工作站上运行,同时访问单个 MS SQL Server 2008 R2 数据存储。

此应用程序管理的部分工作是基于队列的,这意味着有一个工作项池(工作项列表位于单个 SQL 表中),每个用户都可以从中“获取”下一个可用的工作项。我想要完成的是:

  • 一旦工作项被用户“获取”,在第一个用户完成工作之前,其他用户不应以任何方式(包括阅读)访问它,
  • 处理超时(用户在使用工作项时回家过周末)和冻结的客户端(在使用工作项时在工作站上按下重置按钮)。

我知道这是一个相当普遍的问题(更像是一项研究),所以我不期待详细的解决方案,而是有用的链接、最佳实践和/或一些关于该主题的文献。任何帮助都非常感谢,因为我完全不知道从哪里开始。

4

1 回答 1

3

我已经看到使用事务资源锁定表或列来完成此操作。例如,您将记录分配给某人(通过设置用户 ID 或其他机制),同时设置时间戳记录,说明该资源何时被锁定。在访问数据时,无论是查询数据还是尝试更新数据,您首先检查此锁定表/列以确保它可用。如果没有,您不接受更改。

这也支持超时。如果时间戳太旧,则释放锁。如果时间戳太旧,您可以自动假定释放,或者您可以编写一个计划的服务来检查过期的锁并解锁它们。我更喜欢第二种方式,因为检查锁是否存在(行的布尔逻辑或字段值是否存在[即不为空])的成本更低。但我已经看到它是双向的。

于 2013-01-30T16:08:22.240 回答