如何跨网络实现锁定
本文关键字:锁定 实现 网络 何跨 | 更新日期: 2023-09-27 17:53:38
我有一个桌面应用程序。在这个应用程序中,用户可以打开和处理许多记录。如果用户点击一条记录,程序将锁定这条记录,这样其他人就不能使用它了。如果记录已经被锁定,那么用户仍然可以查看它,但它将是只读的。我们本地网络上的许多用户都可以打开和处理记录。
我的第一个想法是使用数据库来管理记录上的锁。但我不确定这是如何或是否是最好的方法。是否有我可以使用的编程模式或现成的解决方案?
我已经为访问数据库的WPF应用程序实现了一个类似的系统,但是我不再能够访问源代码,我将尝试在这里解释。我采用的路线与使用数据库有些不同。使用双工WCF服务,您可以在客户端连接的某个地方(即数据库服务器)托管服务。关键要点:
- 您可以通过具有某种数据类型并确保每个行类型具有相同类型的主键(例如
long
)来使此服务泛型。在这种情况下,您可以使用类似于:bool AcquireLock(string dataType, long id)
的签名,或者如果用户经常修改大量的行,则可以使用bool[]
和long[]
替换bool
/long
。 - 在服务器端,您必须能够快速响应此请求。考虑将数据存储在
Dictionary<String (DataType), Dictionary<User, HashSet<long>>
中,其中根字符串是数据类型。 - 当某人连接时,他可以接收给定数据类型的所有锁的列表(例如,当屏幕打开锁定该类型的记录时),同时也注册接收给定数据类型的更新。
- 客户机与服务器之间的套接字连接定义用户已"连接"。如果套接字关闭,服务器将释放该用户的所有锁,并立即通知其他用户该用户的锁已丢失,使该记录再次可用于编辑。(这包括用户断开连接或终止进程等场景)。
- 为了避免并发问题,请确保用户在允许他进行任何更改之前获得锁。(例如
BeginEdit
,首先与服务器检查,通过在视图模型上实现IEditableObject
)。 - 当锁被释放时,客户端告诉服务器他是否更改了行,以便其他客户端可以更新相应的数据。当套接字断开连接时,假设没有变化。
- 添加了一个很好的特性:当向用户提供锁列表/更新时,也要提供用户id,这样人们就可以看到谁在做什么。
这种形式的"实时并发"提供了比提供处理乐观并发问题的方法更好的用户体验,并且在技术上也更容易实现,这取决于您的场景。