【发布时间】:2013-05-04 14:48:28
【问题描述】:
背景
我有一个表,其中包含两个或多个 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 脚本访问同一个数据库,我如何确保它们不访问同一个记录?
更大的挑战是,如果我想将循环从
start拆分到end到同一 PHP 脚本的多个实例上,即每 100 个值是脚本的一个实例,然后到达1100,将MySQLStart更新为1100并重定向到从1101开始到1200的同一脚本,依此类推,直到达到End数字。在达到End数字后,该记录的Status将设置为1,并将继续下一条记录。在实际情况下,它从头到尾大约有一百万个计数,并且在循环中执行了一些内存密集型功能,因此我需要将其分块。
我所知道的关于行级锁定的所有信息,都是在最后几分钟里学到的;而且这些似乎都不能从一个脚本中回答多个实例锁定问题。
我应该考虑会话 ID/cookie 吗?你有什么推荐的?
【问题讨论】: