繁体   English   中英

我可以将数据库记录标记为“正在使用”吗?

[英]Can I mark a database record as “in use”?

假设我在数据库服务器上有一个表(我们称它为myTable ),并且我正在编写一个桌面客户端应用程序,该应用程序允许您修改myTable中的记录。 我不希望两个用户能够编辑相同的记录,即,如果用户A编辑记录1而用户B尝试执行相同的操作,则他会收到通知,通知说该记录当前已被用户A“锁定”。

我敢肯定这是一个普遍的问题,所以我想知道是否有规范的解决方案。


有一个明显的解决方案,但也有一个明显的缺点:

  • 一个字段添加inUseBymyTable ,它一旦用户开始编辑记录设置为用户的姓名,清除它一旦用户完成,如

     function editRecord(recordId): begin transaction if (select lockedBy from myTable where id = recordId) is not empty: commit show "Sorry, record already in use by ..." else update myTable set lockedBy = current_user() where id = recordId commit show UI window to let user edit and update record update myTable set lockedBy = empty where id = recordId 

    缺点:如果用户A的应用程序崩溃,则记录保持锁定状态。

乍一看,以下方法似乎合适,但无法解决问题:

  • 使用数据库锁来锁定记录1。这只会导致用户B超时。 我需要将记录锁定在应用程序级别而不是数据库级别。

一种常见的方法是使用ROWVERSION进行乐观并发。

Rowversion是一种数据类型(您将添加为新列)在更新行时更新。

因此,选择行,包括rowversion列。 当您发回更新时,请确保行版本匹配-通过进行更新并添加“ WHERE Rowversion = TheRowversionIGotEarlier”并查看@@ ROWCOUNT是否不为0-如果为零,则可以假定有人修改了该行自从您阅读它以来,就可以将该消息返回给用户。

http://www.mssqltips.com/sqlservertip/1501/optimistic-locking-in-sql-server-using-the-rowversion-data-type/

您正在询问悲观并发,正如这个答案和对您的问题的评论所说-请考虑乐观并发。 考虑您的模型,它将如何处理某人开始编辑记录然后吃午餐的问题? 或者,如果他们从午餐后再也没有回来? 如果出于关键的业务原因必须同时编辑记录怎么办?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM