同一个postgres表上的多个cron作业

时间:2014-02-19 07:46:14

标签: postgresql cron locking

我有一个cron作业,每2分钟运行一次,它从postgres表中获取10条记录并处理它们然后在它完成时设置一个标志。我想确定如果第一个cron运行并且需要超过2分钟,另一个将运行在DB上的不同数据而不是相同数据上。

有没有理由处理这种情况?

2 个答案:

答案 0 :(得分:0)

这可以使用数据库事务来解决。

BEGIN;
SELECT                            
id,status,server
FROM
table_log
WHERE
(direction = '2' AND status_log = '1')
LIMIT 100
FOR UPDATE SKIP LOCKED;

我们在做什么?

我们正在从可能正在运行的其他cron-jobs中选择所有可用行(未锁定)。并选择它们进行更新。所以这意味着所有这个查询都会获得解锁,并且所有结果都将仅为此cron-job锁定。

如何更新锁定的行?

简单地在处理器语言(Python,Ruby,PHP)上使用for循环,并为每个更新执行连接,记住我们正在构建1个单一更新。

UPDATE table_log SET status_log = '6' ,server = '1' WHERE id = '1';

最后我们使用

COMMIT;

所有锁定的行都将更新。这可以防止其他查询同时触及相同的数据。希望它有所帮助。

答案 1 :(得分:-1)

完成你的"完成"从二进制到三元的标志("需要工作","在过程","完成")。您还可能希望存储"进程中的pid"进程,如果它死了,你需要清理它,以及它何时开始的时间戳。

或者使用某人已为您编写和调试过的排队系统。