首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果其他人打开了某个记录,如何防止他人打开该记录?

问如果其他人打开了某个记录,如何防止他人打开该记录?
EN

Stack Overflow用户
提问于 2012-03-08 23:44:44
回答 4查看 486关注 0票数 1

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

1)用户打开记录

2)用户对记录进行更改

3)保存对记录的更改

因为这是一个多用户应用程序,所以我希望防止两个用户同时打开相同的记录,并且一个用户的更改覆盖下一个记录的情况,最好是在打开记录时强制执行某种锁定方法,当用户离开页面时,该方法会自动解锁。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-08 23:47:38

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

在这样的情况下,最好也实现超时机制,在这种情况下,记录只能在'x‘分钟内打开,然后被强制关闭。

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

回复您的评论的

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

  • 允许超时机制来处理它。根据您的场景,足够短的时间窗口可以很好地工作。除了超时之外,
  • 还实现了一种心跳机制-页面上的Ajax脚本轮询服务器,让它知道页面仍然打开。如果用户导航离开,服务器会识别跳过的心跳,并取消记录。在这种情况下,超时仍然优先。因此,如果用户保持窗口打开并离开,服务器仍会收到心跳,但当时间窗口关闭时,服务器会取消记录(尽管仍会收到心跳)。
票数 2
EN

Stack Overflow用户

发布于 2012-03-08 23:54:57

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

票数 2
EN

Stack Overflow用户

发布于 2012-03-08 23:53:47

锁定方法正是mysql中提供的方法:

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

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

但是要小心,如果你忘记解锁一个表,或者用户花了很长时间来更改某些东西,并且你只在该用户提交表单时才解锁,系统不会被锁定。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9620457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档