如何在网络上实现锁定

时间:2015-06-05 03:08:39

标签: c# sql-server wpf

我有一个桌面应用程序。在此应用程序中,有许多用户可以打开和处理的记录。如果用户点击记录,程序将锁定记录,因此没有其他人可以使用它。如果记录已被锁定,则用户仍可以查看它,但它将是只读的。我们本地网络上的许多用户都可以打开并处理记录。

我的第一个想法是使用数据库来管理记录锁。但我不确定这是最好的方法。我可以使用任何编程模式或现成的解决方案吗?

1 个答案:

答案 0 :(得分:3)

我为访问数据库的WPF应用程序实现了一个类似的系统,但我不再能访问源代码,我将在这里解释一下。我采取的路线与使用数据库有些不同。使用Duplex WCF service,您可以在某个位置(即数据库服务器)托管客户端连接的服务。要理解的关键事项:

  • 您可以通过使用某种数据类型并确保每个行类型具有相同类型的主键(例如long)来使此服务成为通用的。在这种情况下,如果用户经常修改较大的数字,您可以使用类似于bool AcquireLock(string dataType, long id)的签名或将bool / long替换为bool[]long[]行。
  • 在服务器端,您必须能够快速响应此请求。考虑将数据存储在Dictionary<String (DataType), Dictionary<User, HashSet<long>>的行中,其中根字符串是数据类型。
  • 当有人连接时,他可以接收给定数据类型的所有锁的列表(例如,当屏幕打开时锁定该类型的记录),同时还注册接收给定数据类型的更新。
  • 作为服务器的客户端之间的套接字连接定义用户是“已连接”。如果套接字关闭,服务器将释放该用户的所有锁定,立即通知其他用户已失去锁定,使记录再次可用于编辑。 (这包括用户断开连接或终止进程等场景。)
  • 要避免并发问题,请确保用户在允许其进行任何更改之前获取锁定。 (例如BeginEdit,首先通过在您的视图模型上实施IEditableObject来检查服务器。
  • 当释放锁时,客户端告诉服务器他是否对该行进行了更改,以便其他客户端可以更新相应的数据。当套接字断开连接时,假设没有变化。
  • 添加的好功能:在为用户提供锁定列表/更新时,还提供用户ID,以便人们可以看到谁在做什么。

这种“实时并发”形式提供了比提供处理乐观并发问题的方法更好的用户体验,并且在技术上也可能更容易实现,具体取决于您的方案。