2011-03-21 49 views
1

我在我的MySQL DB中有一个表,它基本上包含“cron”类任务。基本上用户访问一个页面,脚本(php)检查数据库cron表,获取最新的5个“可用”结果并执行与任务相关的脚本。如何确保MySQL选择不会干扰?

我现在预见的问题是2个用户可能会得到相同的任务。请注意,目前我首先运行一个UPDATE查询,它将5个任务分配给当前用户。之后,我执行一个SELECT查询以获得分配给当前用户的5个任务,当他完成后,我将任务标记为已完成。

理论上没有2个用户应该得到相同的任务,但我不确定。我很简单地想知道,如果MySQL可能有一个构建机制来确保这一点,或者是否有已知的方法?

谢谢。

回答

1

您想使用Transactions。通过这种方式,您可以确保多步操作(如[UPDATE,SELECT,UPDATE])完全完成,或根本不会发生。

这是一个经典的concurrency问题,值得关于并发和事务的一般性阅读,以便您了解主体。这将帮助您避免线下问题(并发中存在许多棘手的问题!)。

+0

谢谢,我已经阅读了交易记录,并且据我所知,这只能防止数据被提交,除非所有查询都已完成。我不明白这是如何防止其他用户接收到相同的数据库结果?没有办法确定是否有其他用户正在使用相同的结果。 – Naatan 2011-03-21 14:45:08

+1

Hello Naatan,阅读关于表锁的mysql手册,它可能会帮助你 – julioc 2011-03-21 15:14:23

+1

如果有未提交的更改,数据库将锁定受影响的行或表。该锁将阻止对这些对象的进一步读取和写入,直到提交更改。 – 2011-03-21 15:16:23