Порядок блокировок в запросе (postgresql) - PullRequest
2 голосов
/ 28 июня 2010

База данных имеет таблицу X и таблицы An, Bn, Cn, Dn, которые наследуются от X.

Обработка 1 периодически запрашивает данные из X.

Процесс 2 обновляет данные в дочерних таблицах. Например, чтобы обновить таблицы An и Bn, он создает новые таблицы Am и Bm, загружает в них данные, блокирует эксклюзивный доступ An, Bn, удаляет An и Bn и изменяет Am и Bm для наследования X.

Проблема в том, что когда процесс 1 выполняет запрос (например, select * from X), он блокирует таблицы An, Bn, Cn, Dn в режиме совместного использования, и порядок блокировки неизвестен. Если процесс 1 блокирует Bn, то процесс 2 блокирует An, мы имеем тупик.

Есть ли информация о порядке блокировки таблиц в запросах в postgresql (без явной блокировки)? Или, возможно, возможны другие решения?

Ответы [ 2 ]

1 голос
/ 28 июня 2010

Я знаю, что вы сказали без явной блокировки, но, честно говоря, ваша лучшая ставка здесь - это явная блокировка. В качестве первого оператора в обоих пакетах есть команда lock, которая блокирует таблицы, которые вы будете использовать. Самая важная часть в этом заключается в том, что обе lock команды должны блокировать таблицы в том же порядке, иначе вы все равно снова столкнетесь с тупиками.

После этого убедитесь, что обе партии работают максимально быстро, так как вы берете блокировки на уровне таблицы ... вы не хотите удерживать их дольше, чем должны.

0 голосов
/ 28 июня 2010

Есть ли информация о порядке блокировки таблиц в запросах в postgresql (без явной блокировки)?Или, возможно, возможны другие решения?

Обычно реализация mvcc postgresql оградит вас от многих типов взаимоблокировок.См. http://www.postgresql.org/files/developer/transactions.pdf для получения более подробной информации.

Хотя, одним из распространенных решений является просто устранение взаимоблокировок, то есть, если ваш запрос не выполняется из-за тупика, попробуйте еще раз .?

...