Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在网络上实现锁定_C#_Sql Server_Wpf - Fatal编程技术网

C# 如何在网络上实现锁定

C# 如何在网络上实现锁定,c#,sql-server,wpf,C#,Sql Server,Wpf,我有一个桌面应用程序。在这个应用程序中,有许多用户可以打开和处理的记录。如果用户单击某个记录,程序将锁定该记录,以便其他人无法使用它。如果记录已被锁定,则用户仍可以查看它,但它将是只读的。我们本地网络上的许多用户可以打开和处理记录 我的第一个想法是使用数据库来管理记录锁。但我不确定这是如何或是否是最好的方法。我是否可以使用任何编程模式或现成的解决方案 我已经为访问数据库的WPF应用程序实现了一个类似的系统,但是我不再能够访问源代码,我将尝试在这里解释。我采取的路线与使用数据库有些不同。使用服务器

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


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

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

  • 您可以通过使用某种数据类型并确保每个行类型具有相同类型的主键(例如a
    long
    )来使此服务成为通用服务。在这种情况下,如果用户经常修改大量行,则可以使用类似于:
    bool AcquireLock(字符串数据类型,长id)
    的签名,或者将
    bool
    /
    long
    替换为
    bool[]
    long[]

  • 在服务器端,您必须能够快速响应此请求。考虑将数据存储在沿着描述的代码行中的某个地方,使用TFS这样的源代码管理系统是最容易的。但那是因为你的描述不充分。请提供有关工作流、数据类型等的更多信息。这仍然是一个过于宽泛的问题,但在问题结束之前,您可能会得到一些有用的评论。听起来您想研究实现悲观锁定的方法。这个网站上有很多类似的Q。你不想使用SQL锁定。SQL锁基于隔离级别和DM类型。如果没有您的控制,SQL锁从一行开始,然后自动升级到页面(每页有多行),最终升级到整个表。理想情况下,SQL锁应该持续毫秒,而不是人工编辑间隔。解决用户会话锁定有很多可能的模式,但它们取决于各种细节(正如John Saunders所指出的)。您描述的是悲观锁定,而不是乐观锁定。每个都有自己的用途。由于性能问题,悲观主义者通常不受欢迎。尽管如此,它有时是你所需要的。如果这确实是您想要的,那么您需要让ADO命令启动SQL BEGIN TRAN,在进程的生命周期内保持相同的连接对象处于活动状态,并且在获取记录时使用UPDLOCK提示。我真的不想在SQL server中锁定记录。我在想也许我可以在表上创建一个名为“Locked”(bool)的列。然后,当用户单击记录时,程序将检查锁定标志是否为真。如果为true,则返回true。如果为false,则会将锁定标志设置为true。你看到这种方法有什么问题吗?这很好。在你的第二个要点中,字典会在一个静态类中吗?而且,使用双工服务通知客户机是个好主意。我从来没有想过。我使用了一个非常类似的系统,这是我几年前做的一个项目。另一个与之配套的特性是能够通过主键“订阅”文档。服务器保存一个感兴趣的客户列表,并向他们发送一条消息,告知他们所订阅内容的更改。客户端在以只读方式查看密钥时订阅该密钥,并且在有人编辑密钥时可以立即获取更改。我们遇到的唯一问题是,有些人周末回家时会将关键文件锁定。我们最终实现了“超时”,管理员可以从管理屏幕强制释放锁。同意@BradleyUffner提到的超时。我使用了单实例WCF服务,所以您可以将其保持在本地状态,或者使用静态类,使其线程安全,以便允许不同线程上的多个客户端使用它。