防止PHP中的并发表单覆盖

时间:2015-07-29 13:09:20

标签: php design-patterns

我们正在设置一个系统,允许部门在此处对记录进行编辑。他们的分工并不清楚,过去他们遇到了一些问题,多个人将数据加载到网络表单中,进行编辑,然后将这些编辑内容发送到记录中。不可避免的是,较慢的编辑器使用在加载页面时加载的旧数据覆盖了编辑器的新编辑数据。

目前,我们有一个白板解决方案,可以使用对数据上次修改时间的更改来拒绝第二个写入数据的请求,并在该数据发布时传递错误消息。

然而,该部门的成员更喜欢文件锁定风格的系统 - 在这个系统中,他们被通知另一个用户在之前的 中被允许访问数据。根据日期的不同,超时将不可避免地太短或太长,并且这些特定的用户不能依赖于"退出"不知。

我只是想知道是否有其他人已经为此实施了解决方案,如果是,如何

我们在Apache 2.2上运行PHP 5.6并在Zend Framework 2.4中构建。并不是说任何一个与这个问题有任何关系,但有人会不可避免地问。

3 个答案:

答案 0 :(得分:1)

为什么不在edit_in_progress的表格行上设置一个标志?如果用户点击进行编辑并且已经设置了该标志,则会显示一条消息,说明其他人正在编辑它(可能还要考虑为WHO设置一个字段正在编辑它,以便他们可以在保存并继续之前返回他们的编辑)。保存后,取消设置两个字段,并允许下一个用户锁定该行。

答案 1 :(得分:1)

在表locked_by_user_idlocked_time中添加2列。

在允许用户进入“编辑”视图之前,请检查是否已设置这些值以及locked_time是否在过去10分钟内。您应该记录锁定时间而不是二进制标志的原因是,正如您所说,有些人忘记注销或者可能不会干净地注销(例如,他们只能关闭浏览器)。

当有人能够获得锁定时,设置一个每5分钟运行一次的setInterval,通过ajax调用重新获取锁定。有人可能会忘记离开“编辑”屏幕,但在这种情况下,您可以允许其他人覆盖锁定,如果发生这种情况,您可以让ajax调用在无法重新获取锁定时退出“编辑”屏幕。

答案 2 :(得分:1)

假设您正在使用数据库,但不知道您正在使用的数据库架构,这将是一个通用的答案。

您需要为每条记录提供一个设置为非唯一的标识符。这样,我的意思是每条记录都可以标识为record_1record_2 ... record_n,但此标识符可以在表格中多次出现。

编辑记录时,不要直接更新记录,而是创建

的新记录
  • timestamped
  • 具有原始record_n标识符

此外,在记录中添加一个字段以显示其当前状态(例如stableediting?)以及一个字段,该字段在编辑时提供编辑开始日期/时间

这样,当有人想要编辑记录(例如record_2)时,您将检索此记录的最新数据并检查其状态(如果标记为editing,则报告此并预防并发编辑)。

当他们提交更改时,会在数据库中创建一个新的带时间戳的记录,您将旧记录和新记录标记为稳定。

使用此功能,您还可以创建用于审核更改的纸质跟踪

对于那些徘徊/退休/死亡并将记录留在编辑状态的人,创建一个预定作业,在预设的分钟数(60?)后将状态重置为“稳定”