锁定用户记录并阻止编辑?

问题描述 投票:3回答:2

在处理我的新应用程序时,客户回复了我的具体要求。他们希望防止多个用户同时编辑相同的记录。例如,如果User 1登录应用程序,搜索记录然后选择记录。几种不同的形式显示所选记录的数据。例如,可以是人口统计形式,家庭信息等。假设我们有登录并选择相同记录的User 2。在这种情况下,我们希望阻止他们同时编辑任何表单。我想知道我的方法是否合适,或者有更好的方法。我接下来做的是:

  • 用户选择记录,自动将此记录保存在Lock表中
  • 锁表具有RecID(自动增量字段),UserID(系统中每个用户的唯一ID),SelectedID(用户选择的记录)和DateTime(时间戳)
  • 然后我禁用前端每个表单中的所有Edit按钮。
  • 在后端,我将Lock表连接到每个更新查询。例如: <cfquery name="updateDemo" datasource="#dsn#"> Update dbo.Demographic Set LastName = 'Kelly', FirstName = 'Mike', DOB = '07/06/1967' From Demographic AS D Left Outer Join dbo.Lock AS L On L.SelectedID = D.SelectedID Where RecID = '123132' And L.UserID = Session.UserID </cfquery>

在上面的查询中,我连接将更新到Lock表SelectedID的表。这样只选择记录更新,我们确保Lock表中的UserID与Session User ID匹配。用户可以通过单击系统中的解锁按钮随时解锁所选记录。我不确定这种方法是否最好。到目前为止,我找不到任何问题,但此代码仍处于开发阶段。如果有人有任何建议,请告诉我。我在前端使用SQL 2008,ColdFusion 2016与JQuery和Bootstrap 3。

sql-server-2008 coldfusion locking optimistic-locking
2个回答
1
投票

您的解决方案应该有效,但听起来有点复杂。我会:

  1. 将updatedAt列添加到人口统计表,并在保存时使用getdate()更新它。
  2. 将updatedAt字段添加到表单中,并使用表中的记录数据预填充该字段。
  3. 更新时,请确保表中的updatedAt字段等于表单数据中的updatedAt字段。如果表中的updatedAt字段比表单中的updatedAt数据新,则抛出错误。

1
投票

以下是我过去解决这个问题的方法。

对于需要这种“锁定”的信息,请添加一个名为“version”的数字列。

每次保存此表中的一行时,将'version'的值递增1。

以用于编辑表格的任何形式包含此值。

如果用户A与用户B同时提取记录,但用户B首先保存信息,则当用户A提交其表单时,“版本”将不同。

在表单提交时,请检查传入的“版本”是否与数据库中的“版本”匹配。如果确实...更新表格。如果它没有将用户重定向到表单并让他们知道他们没有更新数据的最新“版本”并为他们提供加载更新数据的选项。

© www.soinside.com 2019 - 2024. All rights reserved.