Долго работающая функция блокировки базы данных? - PullRequest
0 голосов
/ 31 октября 2018

Это нормально для функции, чтобы получить блокировку уровня базы данных, которая предотвращает автоматическую очистку и создание индекса для совершенно не связанных таблиц?

У меня есть долговременная хранимая процедура, которая читает из одной таблицы и записывает данные SUM() / AVG() в другую таблицу. Во время выполнения сценария (который может занять почти час в больших системах), автоматическая очистка останавливает и пытается выполнить такие действия, как создание индексов (CREATE UNIQUE INDEX CONCURRENTLY) для несвязанных таблиц до блок . Как только хранимая процедура завершается, заблокированные процессы завершаются.

Думая, что что-то в хранимой процедуре неправильно блокировало некоторый ресурс, я переписал это буквально просто как сон:

CREATE OR REPLACE FUNCTION summarize_day(p_agg_date date)
RETURNS int AS
$$
BEGIN
  SELECT pg_sleep(120);
  RETURN NULL;
END;
$$ LANGUAGE plpgsql;

Даже эта сохраненная процедура «ничего не делать» предотвращала автоматическую очистку и другие операции с базой данных.

Есть ли способ закодировать его, чтобы НЕ блокировать базу данных для других операций во время выполнения этой длительной процедуры?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Человек, отвечающий на вопрос, немного отредактировал мой исходный вопрос и ответил на очень общий вопрос, а не на тот, который я задавал.

Первоначальный вопрос заключался в том, может ли хранимая процедура PostgreSQL поддерживать небольшие транзакции вместо одной долго выполняющейся. Начиная с версии 11, он может:

Управление транзакциями

0 голосов
/ 31 октября 2018

VACUUM не позволяет помечать мертвые кортежи длительными транзакциями. Система отслеживает самый старый идентификатор транзакции (xid), который все еще может быть видимым в любом снимке (даже без участия конкурирующих блокировок.) Кортежи с более поздней xid не может быть удалено, пока не завершены блокирующие транзакции. В этом отношении длительные транзакции могут остановить VACUUM.

Связанный:

Однако я не могу придумать, каким образом CREATE UNIQUE INDEX на несвязанной таблице должно быть напрямую затронуто. Могут быть другие транзакции, заблокированные блокировками длительной транзакции, которые в свою очередь удерживают блокировки, блокирующие CREATE UNIQUE INDEX. Блокировки длительных транзакций могут вырасти таким образом. Поэтому держите ваши транзакции краткими при одновременной загрузке записи.

Связанный:

Дальнейшее чтение:

"Когда автоочистка не пылесосится" (сообщение в блоге Томаса Вондры)

...