【问题标题】:How do I prevent people from opening a record if someone else has it open?如果其他人打开了记录,我如何防止人们打开它?
【发布时间】:2012-03-26 02:25:39
【问题描述】:

我正在创建一个 PHP Web 应用程序,这将涉及:

1) 用户打开记​​录

2) 用户对记录进行更改

3) 保存对记录的更改

由于这是一个多用户应用程序,我想防止两个用户同时打开相同的记录,并且一个用户的更改覆盖下一个用户的更改,最好在记录被执行时执行某种锁定方法当用户离开页面时自动解锁。

【问题讨论】:

标签: php mysql html forms


【解决方案1】:

记录是指SQL记录?如果是这样,您可以添加另一列isOpen。只要其他人打开它,就将其设置为1,在这种情况下,请勿将其提供给其他任何人。

在这种情况下,最好还实现一个超时机制,其中记录只能打开'x'分钟,然后才被强制关闭。

(编辑:此答案假设您希望在用户查看从表中获取的信息的整个持续时间内保持记录锁定。如果您只想在发生读/写操作的那一刻锁定记录据记录,MySQL 引擎为此内置了机制)

回应您的评论

为了在活动用户离开时让其他人可以访问记录,我想到了两种方法来实现它:

  • 允许超时机制来处理它。根据您的情况,足够短的时间窗口可以正常工作。
  • 除了超时,还要实现心跳机制——页面上的 Ajax 脚本会轮询服务器,让它知道页面仍然打开。如果用户离开,服务器会识别跳过的心跳,并取消记录。在这种情况下,超时仍然优先。因此,如果用户让窗口打开并走开,服务器仍会收到心跳,但当时间窗口关闭时,服务器会取消记录(尽管仍会收到心跳)。

【讨论】:

  • 我已经想到了这一点,但是如果用户只是导航离开记录而不保存它会发生什么?当用户离开页面时,是否有办法取消设置“isOpen”,还是我必须完全依赖超时机制?
  • 一种侵入性较小的方法(用户体验方面)不会禁止第二个用户单击“编辑”按钮保存记录,而只是通知他另一个用户(甚至可能指定谁,具体取决于应用程序业务)刚刚打开该记录进行编辑。
  • 查看 unload 事件 - 您可以判断用户何时离开页面 developer.mozilla.org/en/DOM/window.onunload 可能有助于解锁
  • 我不会使用简单的标志,而是使用“locked since”列并在其中粘贴时间戳。您可以将其用作乐观锁定计数器(如果时间戳匹配,用户仍然可以更新)并且您不需要任何复杂的计时器。您甚至不需要清除它,只需在您的选择语句中添加一个 (now - locked_since) > timeout 子句,它就会始终 DTRT。
【解决方案2】:

我使用一个字段update_date。当用户读取记录时,我用这个日期写了一个 cookie。当用户更新记录并提交新数据时,我正在添加WHERE update_date = '$my_escaped_date' AND id = '$the_edited_id',如果mysql_affected_rows 为零,我将显示编辑数据已旧的错误消息。这并不完美,就像您必须重新输入旧数据一样,但它确实可以完成工作。

【讨论】:

    【解决方案3】:

    锁定方法正是 mysql 中可用的:

    http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

    它不是自动的,但它允许你锁定一张桌子,做一些事情,然后再次解锁。

    请注意,如果您忘记解锁表格或用户需要很长时间来更改某些内容并且您仅在该用户提交表单时解锁它,系统不会被锁定。

    更好的方法可能是从表中读取数据,并在提交表单后检查数据是否未被更改。如果有,您可以通知用户更改,否则您可以锁定表,执行更改并再次解锁。

    【讨论】:

      【解决方案4】:

      您可以在记录表中添加字段in_use, 当用户打开该记录时,将其值更新为 1 并保存它 将其更新回 0。

      如果值为 1 - 记录被锁定,不会为其他用户打开。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-21
        • 1970-01-01
        • 2020-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多