0

我即将使用数据库创建一个应用程序,其中允许多个用户编辑有关实体的信息。

tldr:当用户在 C# 中编辑它的信息时,如何锁定数据库中的一行。

我对在执行查询时锁定数据库中的记录进行了一些研究。我主要看到的是用begin transactionand锁定commit transaction。但是,这不适合我的需要,因为它需要锁定比查询执行时间更长的时间。

如果 user1 正在编辑一条记录(在 c# 中,使用表单应用程序,填写一些文本框),那么我需要锁定该行,直到他完成编辑。因为同时 user2 可能会尝试编辑相同的记录。到 user1 完成时,一切都很好,但是当 user2 完成时,他会覆盖或返回有关他正在搜索的记录(名称)不再存在的错误。

一个简单的解决方案是添加一个带有 的列IsLocked,这取决于用户可以编辑一行。但是当由于某种原因应用程序崩溃或用户强制停止任务管理器中的进程时,该行将被永远锁定。(或者在发生这种情况时还有办法执行代码吗?)

另一种方法是执行不带commit transaction. 为此,我相信,您必须保持连接打开,否则它将终止。在运行应用程序时保持开放连接对我来说似乎不是一个好主意,或者是吗?

旁注:标题说(我的)sql,因为我不太确定我将使用哪一个。

谢谢你的时间!

4

1 回答 1

1

我认为在用户以某种 GUI 形式编辑数据时锁定行不是最佳解决方案。应用程序可能会崩溃或用户可以长时间编辑行...这绝对不依赖于您将使用的 SQL 引擎(MS SQL、MySQL...)

  • 记录应该有一些唯一的 ID。所以查询 UPDATE table SET ..... WHERE entityID = someID 不会依赖于以前的值(只知道可能的行删除)

  • 您可以在编辑之前记住值(或作为数据库记录的一部分的某些时间戳)并在更新行之前对其进行检查,这样您就会知道有人更改了相同的记录并且您可以通知用户。

关于“保持连接打开” - DBConnection 实现 IDisposable,阅读这篇文章如何使用它。您不必知道再次打开连接 - 阅读有关SQL 连接池的信息。

于 2014-12-05T18:00:01.487 回答