数据库 - mySQL 和 PHP 更新时更新冲突的信息


Database - mySQL and PHP updating conflicting information on update

所以我有一个保存库存信息的数据库。当工作人员更新该信息时,因为它在线,因此在更改数字时遇到麻烦,最后一个人更新数字并将其用于所有值。

示例:乔更新蔓越莓还剩 3 个,并且在 3 时不碰沙拉。但约翰更新说沙拉是0。当乔按下更新时,沙拉的值被设置回3,因为他们系统认为他也在更新它。

有什么方法可以解决这个问题吗?

如果两个用户使用相同的GUI,其中两个值(蔓越莓和沙拉)可以同时更改(例如,通过按保存按钮),您可以:

  1. 使用 javascript 将用户已更改的值的信息存储在隐藏字段中,然后在 PHP 中保存数据以省略未更改的值时使用此值。
  2. 将每个属性的原始值存储在隐藏字段中,并使用它来将其与用户保存时的新值进行比较,以省略未更改的保存值。
  3. 修改您的 GUI(例如,添加复选框以解锁要更改值的输入
  4. 使用记录版本控制可防止第二个用户更改自分配给此用户以来已更改的记录。然后,您可以打印一条消息,例如"抱歉,此记录自显示以来已更改。请在进行更改之前刷新页面。

选择你最喜欢的一个。

听起来

(有点)像并发问题,但也许不是因为我们谈论的是两个不同的字段。 了解锁定:http://dev.mysql.com/doc/refman/5.0/en/internal-locking.html

您可能希望查看 Joe 如何获取他的信息,因为如果仍然设置了 3 份沙拉并且 John 拿走了它们,那么 Joe 的观点不知道这三种沙拉已经消失了,当他点击更新时(假设他视图中的所有信息都发送到 DB)他无意中将沙拉放回原处。

这是一个常见问题。

您可以:

  • 在写入模式下锁定对此表的访问。
  • 使用交易(我从来没有这样做过)。
  • 仅使用 MySQL 操作来更新数量。(设置数量=数量-2,"推荐"解决方案)

问题的一部分似乎是您的SQL可能构建的方式。如果用户未更改记录的值,则不应对该记录进行新的写入。

通过使用事务,您可以检查自流程启动以来值是否已更改。这允许您根据结果提交或回滚事务。

MySQL 事务

例如,如果用户 A 正在签出 5 种可用沙拉中的 3 种。在用户 A 完成此过程之前,用户 B 还会尝试签出 5 种可用沙拉中的 3 种。使用事务,您可以提供逻辑,以确保在提交事务之前有足够的沙拉来完成事务。如果检查失败,则可以回滚事务。这将防止用户 B 签出比可用沙拉更多的沙拉,即使显示可能已指示在启动交易时有 5 个可用沙拉。