避免在MSSQL中同时访问数据

时间:2013-01-30 16:02:40

标签: c# sql-server concurrency queue

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

这个应用程序管理的部分工作是基于队列的,这意味着工作项池(工作项列表在一个SQL表中),每个用户可以从中获取""下一个可用的工作项目。我想要完成的是以下内容:

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

我知道这是一个相当普遍的问题(更确切地说是一项研究),所以我并不期待详细的解决方案,而是有用的链接,最佳实践和/或一些文献来阅读这个主题。我真的很感激任何帮助,因为我完全失去了从哪里开始。

1 个答案:

答案 0 :(得分:3)

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

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