Postgres ShareRowExclusiveLock lock - PullRequest
       1

Postgres ShareRowExclusiveLock lock

0 голосов
/ 17 марта 2011

У меня есть загрузочный сервер posgres с большим количеством операций обновления. В postgres.conf я установил deadlock_timeout = 8 с.

В журнале вижу следующее:

процесс 3588 приобрел ShareRowExclusiveLock для отношения 17360 базы данных 16392 после 8000.000 мс

Это кажется очень медленным. Каково ваше мнение по этому поводу? Есть ли лучшее значение для deadlock_timeout? Какие другие настройки могут помочь сократить время блокировки? И эта строка из журнала говорит, что транзакция была разорвана и какие-либо данные не были обновлены?

Спасибо за вашу помощь!

Артем

Ответы [ 2 ]

1 голос
/ 17 марта 2011

ShareRowExclusiveLocks получаются, когда вы явно указали оператор LOCK TABLE. Поведение по умолчанию для LOCK TABLE - запрашивать монопольный доступ к таблице: никто не сможет читать из нее, пока не будет снята блокировка.

PostgreSQL использует многоверсионное управление параллелизмом для обработки целостности транзакций в базе данных. Если вы не видите проблем с приложением, я предлагаю отключить явное использование LOCK TABLE или же попытаться запустить операцию массового обновления через несколько часов.

Я бы также посоветовал изучить документацию Explicit Locks , если вам нужно использовать явные блокировки.

1 голос
/ 17 марта 2011

Вы читали это?

http://www.postgresql.org/docs/current/static/runtime-config-locks.html

В идеале настройка должна превышать ваше типичное время транзакции, чтобы повысить вероятность того, что блокировка будет снята доОфициант решает проверить тупик.

...