【发布时间】:2015-06-06 00:40:18
【问题描述】:
我有一个桌面应用程序。在此应用程序中,用户可以打开和处理许多记录。如果用户单击记录,程序将锁定该记录,因此其他人无法使用它。如果记录已经被锁定,那么用户仍然可以查看它,但它将是只读的。我们本地网络上的许多用户都可以打开和处理记录。
我的第一个想法是使用数据库来管理记录上的锁。但我不确定这如何或是否是最好的方法。我可以使用任何编程模式或现成的解决方案吗?
【问题讨论】:
-
根据您的描述,使用 TFS 等源代码控制系统是最简单的。但那是因为你的描述不够充分。请提供有关工作流程、数据类型等的更多信息。这仍然是一个过于宽泛的问题,但在问题结束之前您可能会得到一些有用的 cmets。
-
听起来你想研究实现悲观锁定的方法。这个网站上有很多类似的Q。
-
您确实不想使用 SQL 锁定。 SQL 锁基于隔离级别和 DM 类型。如果没有您的控制,SQL 锁会从 ROW 开始,然后自动升级到页面(每页多行),最终升级到整个表。理想情况下,SQL 锁应该持续几毫秒——而不是人工编辑间隔。有许多可能的模式可以解决用户会话锁定问题 - 但它们取决于各种细节(正如 John Saunders 指出的那样)。
-
您描述的是悲观锁定,而不是乐观锁定。各有各的用途。由于性能问题,悲观主义通常不受欢迎。然而,它有时是你所需要的。如果这确实是您想要的,您需要让您的 ADO 命令启动 SQL BEGIN TRAN,在整个进程的生命周期内保持相同的连接对象处于活动状态,并且在获取记录时使用 UPDLOCK 提示。
-
我真的不想在 SQL Server 中锁定记录。我在想也许我可以在表格上创建一个名为“Locked”(布尔)的列。然后,当用户单击记录时,程序将检查 Locked 标志是否为真。如果它为真,那么它将返回真。如果它是假的,那么它将锁定标志设置为真。您发现这种方法有什么问题吗?
标签: c# sql-server wpf