MySQL查询相互重叠

时间:2011-08-23 17:15:57

标签: php mysql

我遇到了MySQL查询的问题,有几个查询似乎相互重叠。基本上,我有一些PHP代码(通过REST API调用)使用带PDO的MySQL,如果它尚不存在,则将值插入表中。如果存在,则更新记录。非常简单的东西,它似乎99%的时间都在工作。但在某些情况下,相同的记录会被插入两次(而不是第二次更新)。

我查看了MySQL日志,发现在极少数情况下,脚本会以某种方式同时运行两次(导致重叠查询)。请注意进程ID 95587和95588似乎是重叠的。

95587 Connect     @localhost on ****
95588 Connect     @localhost on ****
95587 Query       SET NAMES utf8
95588 Query       SET NAMES utf8
95588 Query       SELECT * FROM `my_table` WHERE `data` = '89158268' LIMIT 1
95587 Query       SELECT * FROM `my_table` WHERE `data` = '89158268' LIMIT 1
95588 Query       INSERT INTO `my_table` (`data`, `date_created`, `date_updated`) VALUES ('89158268', '2011-08-21 17:11:10 ', '2011-08-21 17:11:10 ')
95587 Query       INSERT INTO `my_table` (`data`, `date_created`, `date_updated`) VALUES ('89158268', '2011-08-21 17:11:10 ', '2011-08-21 17:11:10 ')
95588 Quit
95587 Query       SELECT * FROM `another_table`
95587 ... more queries

这是代码的顺序:

  1. SELECT * FROM my_table WHERE data ='89158268'LIMIT 1
  2. 如果找到记录,则更新my_table
  3. 如果找不到记录,则将新记录插入my_table,然后继续其他查询
  4. 有谁能想到为什么这两个mysql进程似乎相互重叠的原因?任何帮助是极大的赞赏。谢谢。

1 个答案:

答案 0 :(得分:0)

尝试在选择之前锁定表格:

LOCK TABLE my_table WRITE;
SELECT * FROM `my_table` WHERE `data` = '89158268' LIMIT 1;
INSERT INTO `my_table` (`data`, `date_created`, `date_updated`);
UNLOCK TABLES;

这将避免任何其他MySQL会话使用my_table表,并避免此竞争条件。