【问题标题】:Data updating conflict数据更新冲突
【发布时间】:2011-04-01 16:40:42
【问题描述】:

我目前正在开发一个遇到小问题的 Web 应用程序。在这个系统中,多个用户可以登录同一个页面并更新数据(一系列复选框、下拉菜单和文本字段)。

问题是,如果一个用户已经在加载旧数据的页面上,并且已经更新,并提交他们的更改,这会更新所有内容,则数据可能会被覆盖。

关于如何解决这个问题的任何建议?我目前只处理纯文本文件。

【问题讨论】:

  • 推荐阅读:Concurrency(用于数据库,但仍适用于此处)。这个特殊的问题称为“丢失更新”问题。

标签: php web-applications conflict


【解决方案1】:

我目前只处理纯文本文件。

建议 1. 使用数据库。

建议 2. 使用锁定文件。使用操作系统级别的 API 调用以独占方式打开文件 锁。第一个获取此文件的用户对数据具有独占访问权。当那个 用户完成他们的事务,关闭文件,释放操作系统级别的锁。

建议 3. 不要“更新”文件。记录更改的历史记录。然后,您可以从日志中读取用户名和时间戳以查找最新版本。

如果你这样做,你需要让每个请求都做这样的事情。

  1. 获取当前状态时,从文件中读取最后一行。另外,获取文件大小和上次修改时间。保留会话中的大小和上次修改时间。在表单中显示当前状态。

  2. 在处理用户的更改时,检查文件大小和上次修改时间。如果文件与会话中记录的文件不同,则该用户正在尝试更新由其他人更改的数据。从文件中读取最后一行。另外,获取文件大小和上次修改时间。保留会话中的大小和上次修改时间。在表单中显示当前状态。

此外,您可能需要两个文件。一个带有“当前”数据,另一个带有更改历史记录。这可以更快地找到当前数据,因为它是当前状态文件中的唯一记录。

另一种选择是在文件中添加一个“标题”,它是一个固定大小的文本块。每次追加时,您还 seek(0,0) 并使用最后一条记录的偏移量以及最后一次更改的时间戳刷新标题。

【讨论】:

    【解决方案2】:

    在保存新数据时,您可以将修改数据的日期与用户开始编辑的时间进行比较。

    如果在用户进行更改时进行了修改,您可以向用户显示一条消息并询问他们采用哪个版本或允许他合并两个版本。

    修订系统(如 svn、git 等)以同样的方式解决了这个问题。

    【讨论】:

      【解决方案3】:

      您可以创建一个附加表,并在其中存储所有信息以及用户 ID,因此您将能够使用连接访问用户插入的所有数据。

      【讨论】:

      • 抱歉,请通过此回复
      猜你喜欢
      • 2014-04-24
      • 2021-08-22
      • 2017-03-22
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      相关资源
      最近更新 更多