首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >避免重复的条目MySQL和PHP

避免重复的条目MySQL和PHP
EN

Stack Overflow用户
提问于 2013-03-26 18:58:31
回答 3查看 2.4K关注 0票数 0

我在我工作的地方开发了一个网络售票系统,遇到了一个奇怪的麻烦。

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

然而,这个工具工作得很好,因为在过去的2-3天里,当工单流量增加时,会出现2到3个工程师一起按下“获取工单”按钮,他们都被分配到同一个工单的情况。

有没有人能帮我找出避免这种bug的最好方法。

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

如有任何建议,请提供帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-26 19:07:34

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

有用的链接PHP + MySQL transactions examples

票数 1
EN

Stack Overflow用户

发布于 2013-03-26 19:02:00

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

票数 1
EN

Stack Overflow用户

发布于 2013-03-26 19:13:29

如果您的数据库结构包含

  • 票证的唯一标识符
  • ”标志
  • 用户id的"assigned_to“列
  • 票证创建时间戳和/或票证更新时间戳

<代码>F29

您可以使用原子更新和更新上的limit子句来修复此问题:

代码语言:javascript
运行
复制
UPDATE  tickets
    SET
        assigned = TRUE,
        updated_at = NOW(),
        assigned_to = @current_user_id
    WHERE assigned = FALSE
    LIMIT 1;

然后,您可以使用select命令“获取”已分配给当前用户id的打开票证:

代码语言:javascript
运行
复制
SELECT *
    FROM tickets
    WHERE assigned_to = @current_user_id
    ORDER BY updated_at DESC
    LIMIT 1;

这利用了任何update子句的原子性质。因为您的更新工作不需要被分解成多个语句,所以您不需要对事务进行迫切的需求。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15635329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档