gpt4 book ai didi

php - MySQL、PHP 在负载下重复

转载 作者:行者123 更新时间:2023-11-29 05:59:01 24 4
gpt4 key购买 nike

我正在使用 php 和 mysql(特别是 mariadb)进行基本的用户注册。有时我的表中有重复项(用户每周有几次在同一秒创建)。当然,我在 PHP 代码中检查了(基本的 SELECT COUNT(*) FROM bla WHERE bla bla)是否存在包含此特定电子邮件和其他参数的行。如果是,那么我知道存在重复项。如果不是,我创建一个新用户(插入行)。

这在理论上应该是正确的。问题是在 SELECT 和 INSERT 之间有很多其他代码,我假设当用户以某种方式同时提交注册表单两次时,这两个操作之间存在延迟。

交易之类的东西会阻止这种情况发生吗?事务是否锁定“用户”表直到提交,以便另一个并行进程无法在事务发生时插入行?或者这是交易不会做的事情?

我无法在表中创建唯一键,因为它不仅与重复的电子邮件有关,还与值不同的其他列有关( guest 用户可以有重复项,而非 guest 则不能)。

这是允许的

电子邮件 |嘉宾

  1. a@gmail.com 0
  2. a@gmail.com 1
  3. a@gmail.com 1

这不是

电子邮件 |嘉宾

  1. a@gmail.com 0
  2. a@gmail.com 0
  3. a@gmail.com 1

感谢您的回复。

最佳答案

你必须在你的表中放置一个 UNIQUE 约束

UNIQUE 约束确保列中的所有值都不同。每个表可以有多个 UNIQUE 约束,但每个表只能有一个 PRIMARY KEY 约束。 https://www.w3schools.com/sql/sql_unique.asp

为您的 guest 用户使用 NULL 值,因为 UNIQUE 索引允许可以包含 NULL 的列有多个 NULL 值

另一种方法可能是使用存储过程

不检查用户是否存在于应用程序级别,而是创建一个存储过程,以原子方式检查重复项并在可能的情况下插入

https://www.w3resource.com/mysql/mysql-procedure.php

关于php - MySQL、PHP 在负载下重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46661898/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com