Доброго вечера/дня/утра.
Есть такая грустная ситуация: Есть база данных с которой работают из разных соединений, и соотвественно из разных транзакций.
Один из процессов работающих с базой данных, периодически пишет в таблицу A.
Запрос типа:
UPDATE A SET field1=TRUE WHERE id=111
Так вот этот запрос блокируется, причём блокируется другой транзакцией, в которой как мы не анализировали и не пытались понять, в которой нет ни одного повода блокировать таблицу A. (вторая транзакция вообще не пишет в эту таблицу ничего.)
Смотрел какие есть "висячие" запросы таким запросом:
SELECT * FROM pg_stat_activiy
Отображал связь какой запрос какой транзакцией заблокирован я вот таким скриптом.
SELECT
waiting.locktype AS waiting_locktype,
waiting.relation::regclass AS waiting_table,
waiting_stm.current_query AS waiting_query,
waiting.mode AS waiting_mode,
waiting.pid AS waiting_pid,
other.locktype AS other_locktype,
other.relation::regclass AS other_table,
other_stm.current_query AS other_query,
other.mode AS other_mode,
other.pid AS other_pid,
other.granted AS other_granted
FROM
pg_catalog.pg_locks AS waiting
JOIN
pg_catalog.pg_stat_activity AS waiting_stm
ON (
waiting_stm.procpid = waiting.pid
)
JOIN
pg_catalog.pg_locks AS other
ON (
(
waiting."database" = other."database"
AND waiting.relation = other.relation
)
OR waiting.transactionid = other.transactionid
)
JOIN
pg_catalog.pg_stat_activity AS other_stm
ON (
other_stm.procpid = other.pid
)
WHERE
NOT waiting.granted
AND
waiting.pid <> other.pid;
Но это не очень помогло.
Люди, кто знает как получить знание о том какие действия/запросы привели к блокировке того или иного объекта в БД. Ну нельзя же сидеть и гадать на кофейной гуще!
По крайней мере должны быть чётко определённые правила, которых я пока что не нашёл.
Помогите плиз кто может по существу.