postgres висит на вставке, тупик? - PullRequest
0 голосов
/ 28 января 2020

Config: Postgres 12.1 с уровнем изоляции зафиксированного чтения. Я пытаюсь вставить одну и ту же запись из нескольких приложений через jdb c с откатом в конце каждой транзакции (интеграционные тесты с использованием общей базы данных). К сожалению, postgres зависает, когда одновременно выполняется более одной вставки. После выполнения некоторых запросов я обнаружил, что PID 11837 (insert), wait_event_type Lock, wait_event transactionId заблокирован 11790 (SELECT pg_try_advisory_lock(77433833903597)), idle in transaction. Обычно есть несколько пидов, исполняющих pg_try_advisory_lock(77433833903597), idle in transaction. Это ожидаемое поведение? Я полагаю, что выполнение вставок с разными ключами решит проблему, но я не хочу этого делать, если в этом нет необходимости.

1 Ответ

1 голос
/ 28 января 2020

PostgreSQL должен автоматически обнаруживать взаимоблокировки и отменять транзакции для их устранения. Это можно сделать только в том случае, если все ребра графа взаимоблокировки находятся внутри базы данных. Например, если один сеанс ожидает другого в коде Java, то у вас может быть неразрешимая тупик, потому что этот край невидим для PostgreSQL.

заблокирован 11790 (ВЫБЕРИТЕ pg_try_advisory_lock ( 77433833903597)), простаивает в транзакции

Ну, что делает 11790? Он взял блокировку, а затем решил вздремнуть, держа базу в заложниках. Это проблема программирования. Только программист может исправить это, если вы не хотите принудительно прекратить то, что делает этот сеанс. Это не тупик, поскольку 11790 ничем не заблокирован (насколько мы или база данных можем сказать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...