我即将使用数据库创建应用程序,允许多个用户编辑有关实体的信息。
tldr:如何在用户使用C#编辑信息时锁定数据库中的行。
我已经做了一些关于在执行查询时锁定数据库中的记录的研究。我最常看到的是锁定begin transaction
和commit transaction
。但是这不符合我的需要,因为它需要被锁定的时间长于查询执行的时间。
如果user1正在编辑记录(在c#中,使用表单应用程序,填写一些文本框),那么我需要锁定该行,直到他完成编辑。因为同时user2可能会尝试编辑同一条记录。当user1完成时,一切都很好,但是当user2完成时,他会覆盖或重新获取有关他正在搜索的记录(名称)的错误。
一个简单的解决方案是添加一个IsLocked
的列,具体取决于用户可以编辑一行。但是当由于某种原因应用程序崩溃或用户强制停止任务管理器中的进程时,该行将永久锁定。 (或者还有一种方法可以在发生这种情况时执行代码吗?)
另一种方法是在没有commit transaction
的情况下执行查询。为此,我相信,你必须保持连接打开,否则它将终止。在运行应用程序时,保持开放式连接对我来说似乎不是一个好主意,或者是它?
旁注:标题说(我的)sql,因为我不太确定我将使用哪一个。
你的时间!
答案 0 :(得分:1)
当用户以某种GUI形式编辑数据时,我不认为这是锁定行的最佳解决方案。应用程序可能崩溃或用户可以长时间编辑行...这绝对不依赖于您将使用的SQL引擎(MS SQL,MySQL ...)
记录应该有一些唯一的ID。因此UPDATE table SET ..... WHERE entityID = someID
之类的查询将不依赖于以前的值(只知道可能的行删除)
您可以在编辑之前记住值(或某些时间戳是数据库记录的一部分)并在更新行之前检查它,这样您就会知道有人更改了相同的记录,您可以通知用户。
关于“保持连接打开” - DBConnection实现IDisposable,阅读this帖子如何使用它。您不必再次知道打开连接 - 请阅读SQL Connection Pooling。