我遇到了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
这是代码的顺序:
my_table
WHERE data
='89158268'LIMIT 1 有谁能想到为什么这两个mysql进程似乎相互重叠的原因?任何帮助是极大的赞赏。谢谢。
答案 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表,并避免此竞争条件。