代码之家  ›  专栏  ›  技术社区  ›  Darryl Hein IrishChieftain

当另一个用户正在编辑某个记录时阻止该记录的编辑-如何?

  •  2
  • Darryl Hein IrishChieftain  · 技术社区  · 15 年前

    我正在尝试向站点添加记录锁定。这不是数据库锁定,我有两个进程同时编辑同一条记录,而是两个用户同时编辑同一条记录。情况如下:

    我需要能够锁定一个记录,而一个人正在编辑它,以便其他人可以在同一时间更改记录(因此造成混乱)。可能发生的情况是用户A开始编辑记录。同时(在用户A保存记录之前),用户B开始编辑记录。现在,用户A用值为“0001”的字段\u A保存记录。现在用户B正在查看和编辑一个过时版本的记录。然后用户B保存值为“0002”的记录。数据库的值为0002。

    我可以理解发生了什么,但是用户很难计算出DB中的值是0002而不是0001。在我的例子中,他们使用这个数字将在线数据库中的记录与另一个记录相关联。当这种情况发生时,他们将在另一个系统中得到2条记录,而在联机系统中得到1条记录。

    我的想法是通过在字段中输入用户的id来“锁定”一个记录。当0时,它未锁定&燃气轮机;0已锁定。

    以下是我对这件事的看法:

    • 当用户单击某个记录上的编辑时,他们将收到该记录的锁。
    • 他们将有这个锁最多X分钟(可能30)。原因是单击“上一步”按钮而不是“保存”或“取消”。
    • 要在不保存的情况下移除锁,他们需要单击编辑页面上的“解锁”(或类似按钮)。我想取消,但我希望他们能够取消,仍然持有锁。
    • 管理员可以移除一个记录的锁,以防它全部崩溃。
    • 添加一个脚本,用于检查已锁定超过30分钟的记录并将其解锁(可能会向锁定该记录的用户发送电子邮件)。

    我想知道的是,是否有任何案件,我错过了会造成悲伤,或如果你有任何建议,如何做到这一点?

    注意:我使用PHP和MySQL,它是一个web应用程序。我也不认为数据库中的记录锁定是我所需要的。

    --补充:来自 Dan Hulton

    1 回复  |  直到 9 年前
        1
  •  4
  •   Charlie Martin    15 年前

    好吧,你需要 一些 锁定方案。对于你所说的这类事情,人们经常使用“乐观锁定”,其工作原理如下:

    • 当有人试图保存文件时,请检查版本号。如果版本号与检索到的版本号相同,则保存, 然后增加版本号 但是

    • 如果有冲突,请用户以某种方式解决。

    (这称为“乐观”,因为您假设大多数情况下不会有两个用户同时尝试更新。)

    这个 悲观的