Deadlock для параллельного выполнения запроса PostgreSQL
Есть монолит в котором по CRON каждый час выполняется приведенный ниже запрос, но данное приложение работает в нескольких экземплярах, и я боюсь что одновременное выполнение может привести к проблемам c блокировками.
На сколько мои подозрения обоснованны? (Решение с встроенным планировщиком PostgreSQL мне не подходит, так как используется Amazon RDS и доступа к соответствующим конфигурационным файлам, для его включения, у меня нет.)
WITH i AS (
UPDATE instances
SET enabled = false
WHERE auto_disable_h IS NOT NULL
AND status != 'NEW' AND last_order_at <= ago_excl_weekend(auto_disable_h)
RETURNING id)
UPDATE settings s
SET archived = true, archived_at = current_timestamp
FROM i
WHERE s.archived = false AND i.id = s.instance_id
RETURNING 1
И функция ago_excl_weekend:
CREATE FUNCTION ago_excl_weekend(
p_hours integer
) RETURNS timestamp
LANGUAGE sql AS
$$
SELECT localtimestamp - make_interval(hours => p_hours) -
(extract(week FROM localtimestamp) -
extract(week FROM localtimestamp -
make_interval(
hours => p_hours + p_hours / 168 * 48
)
)
)
* INTERVAL '48' HOUR
$$;
Таблицы instances и settings
CREATE TABLE IF NOT EXISTS instances
(
id BIGSERIAL PRIMARY KEY,
enabled BOOLEAN NOT NULL,
status VARCHAR(255) NOT NULL,
last_order_at TIMESTAMP,
auto_disable_h INT
);
CREATE TABLE IF NOT EXISTS settings
(
id BIGSERIAL PRIMARY KEY,
archived BOOLEAN NOT NULL DEFAULT FALSE,
archived_at TIMESTAMP,
instance_id BIGINT NOT NULL REFERENCES instances (id)
);