выполняется в транзакционном режиме?
Есть две реализации одной и той же задачи - резервация объектов:
одна через функцию
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
Обсуждают сегодня