【问题标题】:MySQL avoid double entry, when entering 2 same records at same timeMySQL避免双重输入,同时输入2条相同的记录
【发布时间】:2016-03-06 18:00:53
【问题描述】:

我有这样的疑问: 当两个用户点击 book 按钮时,在同一毫秒,MySQL 数据库执行双重输入。如何避免向我的数据库添加双重数据?

参考资料: 后端:PHP 前端:HTML/CSS/JS

我尝试在执行入口语句之前随机中断。

例如:当用户按下:book now 时,我会等待下一个进程几秒钟。然后让它继续向 MySQL 中插入数据。

但这似乎是不好的做法。

我可以知道任何更好的方法来解决这个问题吗?

编辑:例如,我有一个剧院预订系统。情况是:两个或多个用户同时预订同一个时段并且被预订。而其中一个应该成功,而其余的应该会出错。

【问题讨论】:

  • 如果您在数据库表中使用主键,MySQL 将不会创建双重条目。它只会执行两个查询中的一个,而另一个将失败,即使它们在准确的时间发送到数据库。
  • 感谢您的回复。例如,我有一个剧院预订系统。发生的情况是,两个用户同时预订了同一个时段并且它被预订了。而其中一个应该会出错。
  • 如果您的数据库设计正确,则不应发生这种情况。例如,如果您使用一个表来预订时间段,其中主键是日期和时间,那么您不能在该表中为同一个时间段创建两个条目。

标签: php mysql web e-commerce


【解决方案1】:

为了防止用户刚刚输入的数据出现重复条目​​(只是为了防止双击提交按钮插入场景),您可以使用几种解决方案:

  • 使用只触发一次的 javascript 按钮;
  • 在内容和用户 ID 上使用 UNIQUE INDEX

UNIQUE INDEX 场景如下所示:

CREATE TABLE user_comments (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
comments VARCHAR(4000),
user_id INT NOT NULL,
md5sum_comments CHAR(32)
) ENGINE=InnoDB;

CREATE UNIQUE INDEX idx_unique_comments ON user_comments(md5sum_comments,user_id);

md5sum_comments 是 cmets 列上的 md5sum,因为真正的 cmets 对于索引来说可能太大了。

当您现在为用户插入相同的评论两次时,其中一次插入将失败,并出现来自 MySQL 的 NON-UNIQUE 索引错误。由于您不想用这个非唯一索引问题来打扰您的用户,您可以在 php 中捕获它并在进一步处理时忽略它。

【讨论】:

  • 我猜这个问题存在误解。我添加了“编辑”以获得更精确的问题。如果这有帮助。谢谢。
  • 您也可以使用唯一索引解决方案:代替评论,阅读 booked_slot 并在其中插入一个唯一值,插入到 booked 表中。但是,当现在同时发生 2 个预订时,一个会成功,而另一个用户应该会收到错误消息。简而言之:在这些情况下,UNIQUE INDEX 是您的朋友。
【解决方案2】:

如果您在此 PK 列中使用 PrimaryKeys 和 Auto Increment 功能,则不会将双重条目发布到数据库。

【讨论】:

  • 对不起,不是真的:自增主键只会给你一个不错的主键,对重复的数据字段没有任何作用
  • 感谢您的回复。例如,我有一个剧院预订系统。发生的情况是,两个用户同时预订了同一个时段并且它被预订了。而其中一个应该会出错。
猜你喜欢
  • 2015-04-27
  • 2020-07-11
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多