выполняется в транзакционном режиме?
                  
                  
                  
                  
                  
                  Есть две реализации одной и той же задачи - резервация объектов:
                  
                  
                  одна через функцию
                  
                  
                  CREATE OR REPLACE FUNCTION reserve_parallel()
                  
                  
                      RETURNS UUID AS
                  
                  
                  $$
                  
                  
                  DECLARE
                  
                  
                      result UUID;
                  
                  
                  BEGIN
                  
                  
                      SELECT object_id FROM table_name WHERE condition FOR UPDATE SKIP LOCKED INTO result;
                  
                  
                      UPDATE table_name SET column_name = 'value' WHERE object_id = result;
                  
                  
                  
                  
                  
                      RETURN result;
                  
                  
                  END;
                  
                  
                  $$ LANGUAGE plpgsql;
                  
                  
                  
                  
                  
                  а одна через common table expression
                  
                  
                  WITH result AS (SELECT object_id FROM table_name WHERE condition FOR UPDATE SKIP LOCKED),
                  
                  
                       upd as (UPDATE table_name SET column_name = 'value' WHERE object_id = result.object_id)
                  
                  
                  SELECT * FROM upd;
                  
                  
                  
                  
                  
                  
                  
                  
                  Реализация через функцию правильно работает в случае параллельных запросов, а через common table expression - нет. Почему так?
                  
                  
                
Функция не объявленная как parallel saf запрещает параллельное выполнение
у вас запрос с cte странный. Не хватает выражения FROM в подзапросе с UPDATE: UPDATE table_name SET column_name = 'value' FROM result WHERE object_id = result.object_id
Обсуждают сегодня