我在工作场所开发了一个网络票务系统,并遇到了一个奇怪的麻烦。
所有引发的票证都存储在mysql表中。打开的票证由“已分配”列标识,其中“假”是未分配的票证的默认值。然后,工程师点击网页上的“获取票证”按钮,并根据优先级将票证分配给工程师。
该工具工作得很完美,但是,自从过去2-3天,当票务流量增加时,有2或3名工程师同时按下“获取票证”按钮,并且所有工具都被分配了相同的票证。
任何人都可以帮助我避免这种错误的最佳方法。
我甚至试图锁定数据库,但没有用。我期待MySQL事务,但我认为这可能会减慢应用程序。
请提供任何建议!
答案 0 :(得分:1)
您需要使用交易。 数据库环境中的事务在同时访问数据库的程序之间提供隔离。如果没有提供这种隔离,程序的结果可能是错误的。
答案 1 :(得分:1)
您应该在PHP代码中使用MySQL事务
答案 2 :(得分:1)
如果您的数据库结构包含
您可以使用更新的原子更新和限制子句解决此问题:
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;
这利用了任何更新子句的原子性质。由于您的更新工作没有必要分解为多个语句,因此您不需要进行事务处理。
如果更新更复杂,需要您从各个地方选择数据,那么将其组合为更新后,您当然会需要交易。