Postgres lock_timeout при одновременном создании уникального индекса - PullRequest
0 голосов
/ 16 июня 2020

Проблема с созданием уникального индекса для таблицы. Оператор завершается ошибкой со следующим сообщением:

>CREATE UNIQUE INDEX CONCURRENTLY my_table_pkey_new ON my_table (new_id);
ERROR:  canceling statement due to lock timeout

Непонятно, почему у меня тайм-аут блокировки. Параллельное создание индекса не должно блокировать таблицу.

Я также пытался увеличить тайм-аут блокировки, но безуспешно

test=> show lock_timeout;
 lock_timeout
--------------
 5min
(1 row)

test=> set lock_timeout to 99999999;
SET
test=> show lock_timeout;
 lock_timeout
--------------
 5min
(1 row)

1 Ответ

3 голосов
/ 16 июня 2020

Параллельное создание индекса не должно блокировать таблицу.

Конечно, это блокирует таблицу. Что должно произойти, если кто-то попытается удалить таблицу во время индексации? Он просто блокирует его в режиме, который не конфликтует с INSERT, UPDATE или DELETE. Но он конфликтует с другими операциями, включая VACUUM и (возможно, по иронии судьбы) другие CREATE INDEX CONCURRENTLY. Также требуется более сильный замок, который конфликтует со всем, но удерживает его только на мгновение. Но если эта блокировка недоступна немедленно, она может истечь по таймауту во время ожидания. Если так, то я думаю, что вы, должно быть, используете некоторую модифицированную версию PostgreSQL, поскольку я не думаю, что какая-либо версия сообщества PostgreSQL ведет себя так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...