我必须根据表中超过7000万行的每一行来做一些网络IO。由于需要高TPS,我已经创建了一个php脚本,可以为表中的单行执行此任务。我打算每秒使用一次cron作业调用这个php脚本大约40次。我该怎么做才能让没有两个脚本访问同一行。
答案 0 :(得分:3)
要完全基于表格进行操作,您需要设置某些东西在表格中 - 布尔值,时间戳,删除行等 - 表示您已经处理了该行。之后,您只需要一笔交易。
START TRANSACTION;
SELECT * FROM table WHERE processing = 0 ORDER BY id ASC LIMIT 1 FOR UPDATE;
UPDATE table SET processing = 1 WHERE id = $id_of_what_we_got;
COMMIT;
-- process row here
-- optionally, tell the db we're done
UPDATE table SET processing = 2 WHERE id = $id_of_what_we_got;
确保为整个事务使用相同的MySQL连接(PHP资源)。
进一步阅读: