避免重复条目MySQL和PHP

时间:2013-03-26 10:58:31

标签: php mysql transactions mysqli duplicates

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

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

该工具工作得很完美,但是,自从过去2-3天,当票务流量增加时,有2或3名工程师同时按下“获取票证”按钮,并且所有工具都被分配了相同的票证。

任何人都可以帮助我避免这种错误的最佳方法。

我甚至试图锁定数据库,但没有用。我期待MySQL事务,但我认为这可能会减慢应用程序。

请提供任何建议!

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

有用的链接PHP + MySQL transactions examples

答案 2 :(得分:1)

如果您的数据库结构包含

  • 门票的唯一标识符
  • “已分配”标志
  • 用户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;

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

如果更新更复杂,需要您从各个地方选择数据,那么将其组合为更新后,您当然会需要交易。