ПОСТГРЕСС: Узнайте, как долго была получена блокировка - PullRequest
0 голосов
/ 07 сентября 2018

В настоящее время я использую Postgres в качестве движка базы данных для приложения.

В настоящее время у меня есть ситуация, когда у меня есть много блокировок READ (AccessSharedLocks), которые присутствуют. Я запускаю следующий запрос для проверки блокировок:

SELECT t.schemaname,
t.relname,
l.locktype,
l.page,
l.virtualtransaction,
l.pid,
l.mode,
l.granted
FROM pg_locks l
 JOIN pg_stat_all_tables t ON l.relation = t.relid
WHERE t.schemaname <> 'pg_toast'::name AND t.schemaname <> 'pg_catalog'::name

То, что я хотел бы знать, это то, как долго блокировка была получена столом. Можно ли как-нибудь получить эту информацию?

Заранее спасибо.

1 Ответ

0 голосов
/ 07 сентября 2018

Время, когда была взята блокировка, недоступно в PostgreSQL.

Лучшее, что вы можете сделать, это взять время начала транзакции xact_start с pg_stat_activity, то есть нижнюю границу для возраста блокировки.

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

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

...