我有一个cron作业,每2分钟运行一次,它从postgres表中获取10条记录并处理它们然后在它完成时设置一个标志。我想确定如果第一个cron运行并且需要超过2分钟,另一个将运行在DB上的不同数据而不是相同数据上。
有没有理由处理这种情况?
答案 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"进程,如果它死了,你需要清理它,以及它何时开始的时间戳。
或者使用某人已为您编写和调试过的排队系统。