база данных имеет таблицу X и таблиц An, Bn, Cn, Dn, который наследует от X.Порядок блокировок в запросе (PostgreSQL)
Процесс запросы периодически данные из X.
Процесс обновляет данные в дочерних таблицах. Например, для обновления таблиц An и Bn он создает новые таблицы Am и Bm, загружает в них данные, блокирует доступ эксклюзивным An, Bn, падает An и Bn и изменяет Am и Bm для наследования X.
Проблема заключается в том, что когда процесс 1 выполняет запрос (например, select * from X
), он блокирует таблицы An, Bn, Cn, Dn в общем режиме и порядок блокировки неизвестен. Если процесс 1 блокирует Bn, то процесс 2 блокирует. Мы зашли в тупик.
Есть ли информация о порядке блокировки таблиц в запросах в postgresql (без явной блокировки)? Или возможны другие решения?
SELECT не блокирует таблицу, если вы не указали явно для блокировки. Вы проверяли pg_locks, чтобы узнать, что происходит? http://www.postgresql.org/docs/8.4/interactive/view-pg-locks.html –
Таблица блокировок SELECT (http://www.postgresql.org/docs/8.1/static/explicit-locking.html) , и в моем случае он ограничивается эксклюзивным запросом на отказ. ДОСТУПНАЯ АКЦИЯ Конфликты только с режимом блокировки ACCESS EXCLUSIVE. Команды SELECT и ANALYZE получают блокировку этого режима в ссылочных таблицах. В общем случае любой запрос, который только считывает таблицу и не изменяет ее, получит этот режим блокировки. – valodzka
Это конфликтует из-за ACCESS EXCLUSIVE, это ваша проблема. Сам SELECT не является проблемой. –