背景
我有一个表,其中包含两个或多个 PHP 脚本将同时访问的数据。数据看起来像这样:
+--------+-------------------+-----------+-----------+
| ID | Start | End | Status |
+--------+-------------------+-----------+-----------+
| 1 | 1000 | 1500 | 0 |
| 2 | 1000 | 1500 | 0 |
| 3 | 1000 | 1500 | 0 |
| 4 | 1000 | 1500 | 0 |
+--------+-------------------+-----------+-----------+
PHP 脚本在启动时执行以下查询:
SELECT * FROM `table` WHERE `Status` = 0 LIMIT 1
然后 PHP 脚本执行从start
值到end
值(1000 到 1500)的循环。完成后,它Status
将该行的 更新为'1'
。它会自动重定向到自身并重新启动整个过程。
我面临的挑战是:
如果我希望 2 个或更多相同的 PHP 脚本同时运行访问同一个数据库,我如何确保它们没有访问相同的记录?
更大的挑战是,如果我想将循环从同一个 PHP 脚本的多个实例拆分
start
为end
多个实例,即每 100 个值是脚本的一个实例,并且在到达之后1100
,更新 MySQL并重定向Start
到1100
同一个脚本从1101
to开始1200
,以此类推,直到End
达到数量。达到该End
数字后,该记录Status
将被设置为1
并移至下一条记录。在实际情况下,它从开始到结束大约有一百万个计数,并且在循环中执行了一些内存密集型功能,因此我需要将其分块。
我所知道的关于行级锁定的一切,都是在最后几分钟里学到的;而且这些似乎都不能从一个脚本中回答多个实例锁定问题。
我应该考虑会话 ID/cookie 吗?你有什么建议吗?