0

我有一个链接到我的网站的 MySql 数据库,它有一个带有任务列表的表(列由下面的“/”分隔),即:

任务1/doTask1.sh/待办事项

任务2/doTask2.sh/完成

任务3/doTask3.sh/待办事项

任务4/doTask4.sh/待办事项

ETC...

在对我的网站的每个请求中,我希望执行“待办事项”任务,然后由服务器标记为“完成”。任务只能执行一次。但问题来了。

如果什么:

用户 A 选择标记为“待办事项”的任务。doTask1.sh 执行并标记为完成,由用户 A 的请求触发。用户 B 选择标记为“待办事项”的任务(仅限任务 3 和任务 3,因为任务 1 已完成)。doTask3.sh 执行并标记为完成,由用户 A 的请求触发。doTask3.sh 再次执行,由用户 B 的请求触发。doTask4.sh 也是如此。

由于同时存在数据库连接,使用 PHP/Nginx/MySql 会发生这种情况吗?如果是,如何绕过/避免这个问题?


在这个例子中,我使用了 doTaskx.sh 来简化情况。实际上,此列将包含任务描述,支持我的网站的 PHP 脚本将根据该描述执行任务。

4

2 回答 2

1

是的,这可能发生。

解决此问题的一种方法是执行以下操作:

  • 创建“待定”状态”。
  • 当请求执行任务时,对数据库运行更新,将所有匹配 ID 和状态 =“todo”的内容设置为“pending”。
  • 如果更新的记录数为 1,则执行任务并将其标记为“完成”。
  • 如果更新的记录数为 0,则意味着另一个请求首先到达那里。
  • 无论哪种方式,更新用户界面以显示任务正在等待/完成。
于 2012-06-09T17:04:38.343 回答
0

锁定列表。获取仍待执行的请求任务,将它们标记为“进行中”,解锁,然后将它们传递给执行任务的任何对象。

于 2012-06-09T17:00:07.547 回答