我有几台服务器打到一个普通的MySQL盒子,我需要独占访问一个预定作业表。 在这里和其他地方读完之后,我被引导相信SELECT ... FOR UPDATE是我想要的,但现在我们(很少)看到多个服务器拿起相同的记录。
这里是PROC(减去BEGIN / END的东西,因为它正在用我的格式打地狱):
CREATE DEFINER=`root`@`%` PROCEDURE `PopScheduledJob`(OUT `JobId` varchar(36) )
SELECT ScheduledJobId INTO JobId
FROM scheduledjob
WHERE
Status = 0
AND NextRun < UTC_TIMESTAMP()
ORDER BY StartDate
LIMIT 1
FOR UPDATE;
UPDATE scheduledjob
SET Status = 2
WHERE ScheduledJobId = JobId;
所以这里的意图是它应该只获取Status = 0的作业,并立即将其设置为1。 我希望这会阻止任何其他线程/进程访问同一条记录,但现在似乎并非如此。
编辑:忘了提及,我们有一个InnoDB支持商店