一个用户可以更新而其他用户无法选择

时间:2012-07-27 08:43:43

标签: php mysql sql

MySQL和PHP中是否有办法只允许执行更新的人查看有关特定记录的信息?

例如,如果一个用户加载页面,则会向他们显示必须更新的记录,直到该用户完成更新此记录,访问此页面的任何其他用户都无法查看此特定记录。

4 个答案:

答案 0 :(得分:0)

向表中添加“已锁定”列,并在用户调用编辑表单后,将“已锁定”的db值设置为user_id,并在save之后将其设置为false / null。 在您的视图操作中,检查锁定值

答案 1 :(得分:0)

当有人请求编辑页面时,您必须手动锁定行(通过添加IsLocked列),因为一旦PHP脚本执行结束,与数据库的连接就会丢失(尽管pooling等,脚本执行被停止,因此您无法再次从同一个线程解锁,因为该连接可能会转到另一个脚本。)

不要忘记创建一种解锁脚本,例如由cron启动,以解锁已锁定超过一定时间的行。

答案 2 :(得分:0)

我不建议将任何列添加到相关数据表中。我宁愿创建特殊的locks表来保存信息:

create table locks (
    tablename varchar,
    primarykey int,
    userid int,
    locktime datetime);

然后考虑以下原则:

  • 每个PHP请求都是一个独立的mysql连接,这就是为什么像SELECT ... FOR UPDATE这样的解决方案不起作用的原因,这就是为什么你需要保留一个人的用户ID - 实际上是第一次请求并执行锁定的人
  • locks表的每次访问必须锁定整个表(使用MySQL的LOCK语句)以避免锁定同一行时的并发性
  • 如果无法知道,特定用途是否放弃了通过关闭带有记录的窗口来编辑行 - 那么locktime超时必须很短,或者你应该提供一些 ping (即AJAX)机制,只要用户正在处理锁定记录
  • ,就会重置locktime
  • 用户可以保存对记录的更改,只要他/她拥有锁定且locktime未过期
  • tablenameprimarykey当然是样本,您应根据自己的需要进行调整: - )

答案 3 :(得分:-1)

您可以在设置状态的位置添加名为locked的字段。也许您还添加了一个像lockedtime这样的字段,您可以在其中保存锁定活动时间的时间戳。这取决于你的需求。

也有可能做到这一点。像

SELECT * FROM table WHERE primarykey = x FOR UPDATE;