我在我工作的地方开发了一个网络售票系统,遇到了一个奇怪的麻烦。
所有产生的票据都存储在一个mysql表中。打开的票证由列“已分配”来标识,其中“假”是未分配票证的默认值。然后,工程师点击网页上的按钮“获取工单”,并根据优先级将工单分配给该工程师。
然而,这个工具工作得很好,因为在过去的2-3天里,当工单流量增加时,会出现2到3个工程师一起按下“获取工单”按钮,他们都被分配到同一个工单的情况。
有没有人能帮我找出避免这种bug的最好方法。
我甚至尝试过锁定数据库,但没有成功。我正在寻找MySQL事务,但我认为这可能会减慢应用程序的运行速度。
如有任何建议,请提供帮助!
发布于 2013-03-26 19:07:34
您应该在您的PHP代码中使用MySQL事务
发布于 2013-03-26 19:02:00
您需要使用事务。数据库环境中的事务在并发访问数据库的程序之间提供隔离。如果没有提供这种隔离,程序的结果可能是错误的。
发布于 2013-03-26 19:13:29
如果您的数据库结构包含
<代码>F29
您可以使用原子更新和更新上的limit子句来修复此问题:
UPDATE tickets
SET
assigned = TRUE,
updated_at = NOW(),
assigned_to = @current_user_id
WHERE assigned = FALSE
LIMIT 1;然后,您可以使用select命令“获取”已分配给当前用户id的打开票证:
SELECT *
FROM tickets
WHERE assigned_to = @current_user_id
ORDER BY updated_at DESC
LIMIT 1;这利用了任何update子句的原子性质。因为您的更新工作不需要被分解成多个语句,所以您不需要对事务进行迫切的需求。
如果更新更复杂,需要您从不同的地方选择数据,然后将其组合为更新,那么您当然需要事务。
https://stackoverflow.com/questions/15635329
复制相似问题