1

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

例如,如果一个用户加载他们所看到的页面,必须更新一条记录,在该用户完成更新该记录之前,访问该页面的任何其他用户都不能查看该特定记录。

4

4 回答 4

0

向表中添加“锁定”列,一旦用户调用编辑表单,将“锁定”数据库值设置为 user_id,并在保存后将其设置回 false/null。在您的视图操作中,检查锁定的值

于 2012-07-27T08:48:14.853 回答
0

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

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

于 2012-07-27T08:49:50.933 回答
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没有过期,用户就可以将更改保存到记录
  • tablename当然是样本,primarykey你应该根据你的需要调整它们:-)
于 2012-07-27T09:12:39.187 回答
-1

您可以添加一个名为locked您设置状态的字段。也许您还添加了一个字段lockedtime,例如保存时间戳的位置,锁处于活动状态。这取决于您的需求。

也有可能做到这一点。像

SELECT * FROM table WHERE primarykey = x FOR UPDATE;
于 2012-07-27T08:48:51.963 回答