0

我有两张桌子,taskssubtasks。每个子任务都有一个状态(第一次插入时为 PENDING)。然后我运行更新每个子任务的线程(状态变为就绪)。我想要的是当给定任务的每个子任务都准备好时,它们的父任务也准备好。这是我写的触发器:

CREATE FUNCTION update_task_status() RETURNS trigger AS $$
    BEGIN
      INSERT INTO trigger_log SELECT NEW.subtask_id, COUNT(fo_id) FROM subtasks WHERE fo_id = NEW.fo_id AND status <> 'READY';

      UPDATE tasks
         SET status = 'READY'
       WHERE task_id = NEW.fo_id
         AND NOT EXISTS (
             SELECT 1
               FROM subtasks
              WHERE fo_id = NEW.fo_id
                AND status <> 'READY'
             );
      RETURN NULL;
    END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER update_task AFTER INSERT OR UPDATE ON subtasks
FOR EACH ROW EXECUTE PROCEDURE update_task_status();

当我用一项任务和 4 个子任务对此进行测试时,trigger_log表中插入了以下内容:

ID  Pending_count
2        3
1        3
3        3
4        3

最重要的是,在测试完成后,所有子任务都处于 READY 状态,但它们的主要任务仍然是 PENDING。基本上触发器计数不正确。有任何想法吗?

4

1 回答 1

0

首先,我想支持 Daniel Vérité 的建议,即在此处使用可序列化模式(或 SELECT ... FOR UPDATE)。

但是,您的问题缺乏细节,因此可能不是问题。以下是要检查的事项:

  1. 如果您正常运行查询,它是否符合您的预期?首先对您的查询进行故障排除。如果没有,那么您需要找出导致问题的底层数据。鉴于您似乎使用字符串作为状态,这可能是一个非常微妙的问题,例如空格。

  2. 触发器被触发了吗?您可以在触发器中添加 RAISE NOTICE 以确保您在 psql 中看到它实际上正在触发。如果没有,您需要找出原因(可能它被禁用,或者您的查询没有按照您的想法执行)。

于 2013-10-28T08:41:03.570 回答