0

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

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

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

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

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

请帮忙提出任何建议!

4

3 回答 3

1

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

有用的链接PHP + MySQL 事务示例

于 2013-03-26T11:07:34.140 回答
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;

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

如果更新更复杂,需要您从各个地方选择数据并在之后将其组合为更新,那么您当然需要事务。

于 2013-03-26T11:13:28.523 回答
1

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

于 2013-03-26T11:01:59.770 回答