【问题标题】:Avoid Duplicate entries MySQL and PHP避免重复条目 MySQL 和 PHP
【发布时间】:2013-03-26 10:58:30
【问题描述】:

我在工作场所开发了一个网络票务系统,但遇到了一个奇怪的麻烦。

所有提出的票都存储在一个 mysql 表中。未分配票证由“已分配”列标识,其中“假”是未分配票证的默认值。然后工程师单击网页上的“获取工单”按钮,然后根据优先级将工单分配给工程师。

该工具运行良好,但是,由于过去 2-3 天,当工单流量增加时,有 2 或 3 个工程师一起按下“获取工单”按钮,并且他们都被分配了同一个工单。

谁能帮助我避免此类错误的最佳方法。

我什至尝试锁定数据库,但没有成功。我正在寻找 MySQL 事务,但我认为这可能会减慢应用程序的速度。

请提供任何建议!

【问题讨论】:

  • 请显示表的结构和表之间的关系(还要注意应用程序强制执行的逻辑关系)。

标签: php mysql transactions mysqli duplicates


【解决方案1】:

你应该在你的 PHP 代码中使用 MySQL 事务

有用的链接PHP + MySQL transactions examples

【讨论】:

    【解决方案2】:

    您需要使用事务。 数据库环境中的事务在同时访问数据库的程序之间提供隔离。如果不提供这种隔离,程序的结果可能是错误的。

    【讨论】:

      【解决方案3】:

      如果你的数据库结构包含

      • 门票的唯一标识符
      • “已分配”标志
      • 用户 ID 的“assigned_to”列
      • 工单创建时间戳和/或工单更新时间戳

      您可以通过原子更新和更新的限制子句来解决此问题:

      UPDATE  tickets
          SET
              assigned = TRUE,
              updated_at = NOW(),
              assigned_to = @current_user_id
          WHERE assigned = FALSE
          LIMIT 1;
      

      然后您可以使用选择“获取”已分配给您当前用户 ID 的未处理票证:

      SELECT *
          FROM tickets
          WHERE assigned_to = @current_user_id
          ORDER BY updated_at DESC
          LIMIT 1;
      

      这利用了任何更新子句的原子性质。由于您的更新工作没有必要分解为多个语句,因此您不必迫切需要事务。

      如果更新更复杂,需要您从不同位置选择数据,然后将其组合为更新,那么您当然会需要事务。

      【讨论】:

      • 感谢 Mihai Stancu,这正是我所做的,但是大约有 50 个用户登录。唯一的变化是在更新语句之后,有一个插入语句到另一个数据库中使用后。因此,在触发选择查询之前,还会为单击按钮的另一个用户触发更新和插入查询。任何建议如何限制这一点。
      • 如何获取插入语句的数据?通过选择?您是在更新之前还是之后选择数据?
      猜你喜欢
      • 2014-06-17
      • 2019-05-03
      • 2012-08-24
      • 1970-01-01
      • 2013-01-14
      • 2018-08-29
      • 2015-04-29
      • 2023-03-22
      相关资源
      最近更新 更多