具有选择和插入的MySQL潜在竞争条件

时间:2013-04-30 16:16:25

标签: php mysql race-condition

我很难确定我遇到的问题。首先,我有一个IVR表,基本上是一个人们要打电话的队列;它看起来像这样:

---------------------------------------------------------------------------------------------------------------------------------
| id | name | phone_number | has_called | type_of_call | date_called | other_meaningless_statuses |
---------------------------------------------------------------------------------------------------------------------------------

重要的是'has_called_status'。当该状态等于零时,这意味着一个人没有被调用,并出现在队列中进行调用。

我的IVR可以进行多种类型的调用,因此它会将人员添加到不同的列表中(请参阅type_of_call)。我的问题是我按顺序添加这些列表,使用以下查询:

SELECT DISTINCT ub.name, ub.phone_number FROM user_base ub
INNER JOIN ivr_queue ivr ON ub.usercode = ivr.usercode
WHERE ub.needs_call = 1
AND ub.published = 1 AND ub.ready_status = 0 #not important
AND
(
    ivr.has_called != 0
    OR
    ivr.has_called IS NULL
) #important bit!
#optional list-specific statuses go here

程序流程为:使用has_called = 0删除ivr_queue中的所有人员 - >为某个列表选择人员 - >插入列表 - >重复选择并插入所有列表

我遇到麻烦的地方是我在列表之间收到重复的条目。列表偶尔会重叠标准,因此具有重复性。为了避免这种情况,我在上面的查询中添加了两个ivr条件来过滤掉除第一个列表之外的所有重复项,这应该是第一个创建的列表。

我确定ivr条件包含在我的所有选择中,并且管理查询的PHP脚本执行一次选择,然后执行一次插入,并冲洗和重复。我也确定给定列表中没有重复的条目。

我为问题的长度和复杂性道歉,如有必要,我会提供任何其他信息或澄清。

编辑:我得到的副本看起来像这样:列表1有10个名字 - 电话号码对,列表2有30个名字 - 号码对,每个列表中的两个名称 - 号码对是相同的,并且进一步调查确实与我的数据库中的条目相同。据推测,一旦将第一个列表插入数据库,这应该不是问题(给定ivr排除参数) 编辑:如果有必要,我会在我的PHP中进行编辑,虽然它非常详细,因为在我构建代码之后我才知道Zend PDO。

0 个答案:

没有答案