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

时间:2018-09-11 13:02:03

标签: sql-server-2008 coldfusion locking optimistic-locking

在处理我的新应用程序时,客户会根据特定要求返回给我。他们希望防止多个用户同时编辑同一条记录。例如,如果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的表。这样,只有选定的记录才被更新,并且我们确保锁定表中的UserID与会话用户ID匹配。用户可以随时通过单击系统中的解锁按钮来解锁所选记录。我不确定这种方法是否最好。到目前为止,我找不到任何问题,但是此代码仍处于开发阶段。如果有人有任何建议,请告诉我。我使用SQL 2008,ColdFusion 2016和前端的JQuery和Bootstrap 3。

2 个答案:

答案 0 :(得分:1)

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

  1. 将“ updatedAt”列添加到“受众特征”表并对其进行更新 保存时使用getdate()。
  2. 将updatedAt字段添加到表单中,并使用表中的记录数据对其进行预填充。
  3. 更新时,请确保表中的updatedAt字段等于表单数据中的updatedAt字段。如果updatedAt抛出错误 表格中的字段比表单中的updatedAt数据新。

答案 1 :(得分:1)

这是我过去解决此问题的方式。

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

每次保存该表中的一行时,请将“ version”的值增加1。

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

如果用户A与用户B同时提取一条记录,但用户B首先保存了信息,那么当用户A提交表单时,“版本”将有所不同。

在提交表单时,请检查传入的“版本”是否与数据库中的“版本”匹配。如果存在,请更新表。如果它不能将用户重定向到表单,并让他们知道他们没有更新数据的最新“版本”,请给他们一个选择来加载更新的数据。