2016-03-06 135 views
0

我对此有这样的疑问: 当两个用户点击书籍按钮时,在同一毫秒内,MySQL数据库会进行双重输入。如何避免向数据库添加双重数据?MySQL在避免重复输入时,同时输入2条相同记录

参考文献: 后端:PHP 前端:HTML/CSS/JS

我试图给执行入口语句之前随机中断。

例如:当用户按下:现在预订时,我会阻止下一个过程几秒钟。然后让它继续向MySQL插入数据。

但这似乎是不好的做法。

我可以知道解决此问题的更好方法吗?

编辑:例如,我有一个剧院预订系统。情况是:两个或两个以上的用户同时预订同一个插槽并将其预订。而其中一个应该获得成功,其余的应该会得到一个错误。

+0

如果您在数据库表中使用主键,MySQL将不会**创建​​重复条目。它只会执行两个查询中的一个,另一个会失败,即使它们在确切的时间被发送到数据库。 – Aziz

+0

感谢您的回复。例如,我有一个剧院预订系统。会发生什么情况是,两个用户同时预订同一个插槽并将其预订。而其中一个应该会出错。 – Smit

+0

如果你的数据库设计正确,这不应该发生。例如,如果您使用表格预订时间段,其中主键是日期和时间,那么您不能在同一个时间段中在该表中有两个条目。 – Aziz

回答

0

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

+1

抱歉,这不是真的:自动递增主键只能为您提供一个很好的主键,并且对重复的数据字段不起作用 –

+0

感谢您的回复。例如,我有一个剧院预订系统。会发生什么情况是,两个用户同时预订同一个插槽并将其预订。而其中一个应该会出错。 – Smit

+0

对不起对呀 你也必须添加独特的参数。 – linx

1

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

  • 使用JavaScript按钮只触发一次;
  • 对内容& user_id使用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是在评论栏是md5sum,因为真正的注释可以是大的一个指标。

如果您现在为用户插入两次相同的注释,则其中一个插入操作将失败,并且MySQL的NON-UNIQUE索引错误。既然你不想用这个非唯一索引问题打扰你的用户,你可以在php中捕获它,并在进一步处理中忽略它。

+0

我猜这个问题存在误解。我已经添加了“编辑”更精确的问题。如果有帮助。谢谢。 – Smit

+0

你也可以使用唯一的索引解决方案:代替评论,阅读'booked_slot',在那里有一个唯一的值,插入到'预订'表中。但是,现在两个预订同时发生时,一个会成功,另一个用户应该得到错误。总之:在这些情况下,'UNIQUE INDEX'是你的朋友。 –