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

时间:2013-10-18 20:06:53

标签: php mysql

所以我有一个包含库存信息的数据库。由于工作人员更新了该信息,因为它在线时遇到问题,因为更改数字会使最后一个人更新数字并将其用于所有值。

示例:Joe更新蔓越莓剩下3个,并且仍然没有在3处接触沙拉。但是john更新了沙拉是0.当Joe按下更新时,沙拉的值被设置回3,因为他们的系统认为他正在更新它也。

我能解决这个问题吗?

4 个答案:

答案 0 :(得分:1)

听起来(有点)像并发问题,但也许不是因为我们在谈论两个不同的领域。看看锁定:http://dev.mysql.com/doc/refman/5.0/en/internal-locking.html

您可能希望了解Joe如何获取他的信息,因为如果仍然设置了3个沙拉并且John接受了它们,那么Joe的视图不知道三个沙拉已经消失以及何时他点击更新(假设他的所有信息)在他看来被发送到DB)他无意中把沙拉放回去了。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

这是一个常见问题。

你可以:

答案 3 :(得分:0)

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

通过使用事务,您可以检查自进程启动以来值是否已更改。这允许您提交或回滚事务,具体取决于结果。

MySQL Transactions

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