我有一个链接到我的网站的MySql数据库,其中有一个带有任务列表的表格(列在下面用"/"分隔),即:
任务1/doTask1.sh/待办事项
任务2/doTask2.sh/完成
任务3/doTask3.sh/待办事项
任务4/doTask4.sh/待办事项
等。。。
在对我的网站的每个请求中,我希望执行"待办事项"任务,然后由服务器标记为"完成"。该任务只能执行一次。但问题来了。
如果:
用户 A 选择标记为"待办事项"的任务。doTask1.sh 执行并标记为完成,由用户 A 的请求触发。用户 B 选择标记为"待办事项"的任务(仅限任务 3 和任务 3,因为任务 1 已完成)。doTask3.sh 执行并标记为完成,由用户 A 的请求触发。doTask3.sh 再次执行,由用户 B 的请求触发。doTask4.sh 也一样。
由于同时的数据库连接,使用PHP/Nginx/MySql会发生这种情况吗?如果是,如何绕过/避免此问题?
在此示例中,我使用 doTaskx.sh 来简化情况。实际上,此列将包含任务的描述,为我的网站提供支持的 PHP 脚本将根据该描述执行任务。
是的,这可能会发生。
解决此问题的一种方法是执行以下操作:
- 创建"待处理"状态"。
- 当请求进入执行任务时,在数据库上运行更新,设置与 ID 和状态 = "todo" 匹配的所有内容到"挂起"。
- 如果更新的记录数为 1,则执行任务并将其标记为"完成"。
- 如果更新的记录数为 0,则表示另一个请求首先到达该请求。
- 无论采用哪种方式,请更新用户界面以显示任务挂起/已完成。
锁定列表。获取仍在待办的请求任务,将它们标记为"正在进行",解锁,然后将它们传递给执行任务的任何任务。