Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Объйсните почему так происходит / 10 сообщений из 10, страница 1 из 1
26.11.2015, 23:49
    #39114495
gromoboy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объйсните почему так происходит
Приветствую форумчане!
Есть PostgreSQL, выполняется несколько запросов:
Begin Work
Begin Work
Rollback Work
Возникнет ли при выполнении Commit Work ошибка?
Я не понимаю почему бегины вложенные и ошибка будет полюбому, но как объяснить такое поведение?
Думаю я так, ошибка будет т.к. есть незавершенная транзакция, но как она может быть незавершенной если постгри не поддерживает вложенные транзакции, как тогда это смоделировать?
...
Рейтинг: 0 / 0
27.11.2015, 00:27
    #39114513
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объйсните почему так происходит
gromoboyПриветствую форумчане!
Есть PostgreSQL, выполняется несколько запросов:
Begin Work
Begin Work
Rollback Work
Возникнет ли при выполнении Commit Work ошибка?
Я не понимаю почему бегины вложенные и ошибка будет полюбому, но как объяснить такое поведение?
Думаю я так, ошибка будет т.к. есть незавершенная транзакция, но как она может быть незавершенной если постгри не поддерживает вложенные транзакции, как тогда это смоделировать?

А протестировать за 1 секунду никак было нельзя?
Ошибки не будет а произойдет
mboguk=# begin;
BEGIN
mboguk=# begin;
WARNING: there is already a transaction in progress
BEGIN
mboguk=# abort;
ROLLBACK
mboguk=# commit;
WARNING: there is no transaction in progress
COMMIT


Второй begin будет проигнорирован с warning. А rollback откатит транзакцию самую начальную.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
27.11.2015, 09:59
    #39114632
Lonepsycho
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объйсните почему так происходит
gromoboy,

PostgreSQL не поддерживает вложенные транзакции. посмотрите на сторону SAVEPOINT
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
16.10.2020, 15:47
    #40009284
kliff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объйсните почему так происходит
Maxim Boguk
gromoboyПриветствую форумчане!
Есть PostgreSQL, выполняется несколько запросов:
Begin Work
Begin Work
Rollback Work
Возникнет ли при выполнении Commit Work ошибка?
Я не понимаю почему бегины вложенные и ошибка будет полюбому, но как объяснить такое поведение?
Думаю я так, ошибка будет т.к. есть незавершенная транзакция, но как она может быть незавершенной если постгри не поддерживает вложенные транзакции, как тогда это смоделировать?


А протестировать за 1 секунду никак было нельзя?
Ошибки не будет а произойдет
mboguk=# begin;
BEGIN
mboguk=# begin;
WARNING: there is already a transaction in progress
BEGIN
mboguk=# abort;
ROLLBACK
mboguk=# commit;
WARNING: there is no transaction in progress
COMMIT


Второй begin будет проигнорирован с warning. А rollback откатит транзакцию самую начальную.

--
Maxim Boguk
www.postgresql-consulting.ru


Извините, но чтоб темы не плодить. Проблема такая, по наследству досталась кем то написанная система, проблема сейчас в том, что Postgres пишет около 5Гб логов в сутки, абсолютно весь лог состоит из записей
WARNING: there is already a transaction in progress

1. Если не вникать в работу приложения, можно ли как то настроить PG на игнор этого варнинга?
2. Если вникать и переделывать приложение, какой алгоритм поиска подобных косяков? Включил log_statement = all наверное стоит логику от увиденных запросов
LOG: statement: BEGIN;
WARNING: there is already a transaction in progress
LOG: execute <unnamed>: SELECT ...
, разматывать в приложении?
...
Рейтинг: 0 / 0
17.10.2020, 00:25
    #40009396
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объйсните почему так происходит
kliff,

1)никак
2)да полный лог и разматывать в приложении


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
18.10.2020, 16:32
    #40009598
kliff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объйсните почему так происходит
Maxim Boguk, спасибо
...
Рейтинг: 0 / 0
08.12.2020, 10:26
    #40025503
kliff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объйсните почему так происходит
Maxim Boguk, не могли бы еще подсказать. например вся система обвешана долгими транзакциями. Как я понял на каждый запрос от приложения ПГ запускает новый процесс в операционной системе, запрос выполняется и висит там долго в состоянии idle in transaction, ждет коммита. Остальные запросы ждут высвобождения процесса, что его занять. То есть блокировка даже не на уровне БД, а на уровне очереди процессов.

Я почитал, но не очень то понял, если установить pgBouncer между базой и приложением, будет ли он оперативно высвобождать эти процессы, например селект в которых уже отдал результат?

Как я понял из всяких статей, часто упоминается, что ПГ плохо работает, когда количество процессов переваливает за 100. У меня например 300-400 процессов, из них 20 в состоянии active, iner 100 в idle и iner 200 в idle in transaction.

Возможно я вообще не так понял суть происходящего конечно
...
Рейтинг: 0 / 0
08.12.2020, 11:01
    #40025516
Guzya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объйсните почему так происходит
Active - postgres выполняет работу. Все норм, если не висит дольше положенного Вашего профиля нагрузки.
idle in transaction - postgres не выполняет работу, транзакция не завершена. Тут могут быть разные причины:
1. забыли commit\rolback,
2. отправили данные в приложение, приложение что-то делает и потом опять должно обратиться к postgres причем в этой же транзакции.

idle - postgres ни чего не делает, транзакция завершена, но соединение не разорвано. Если у Вас соединения идут с сервера приложений (возможно нескольких), которое в свою очередь использует пул соединений, то это нормально и даже правильно(что бы не устанавливать каждый раз новые соединения используются существующие).
Если же каждое соединение это отдельный клиент, то это уже не очень хорошая ситуация (клиент соединился, поработал, не разорвал соединение, ушел
пить чай или вообще домой) при которой начинается борьба за ресурсы(соединения). Тут и надо задуматься по поводу промежуточного звена в виде пула соединений(PgBouncer|PgPool|что-то еще).

Про pgpool не скажу, но у PgBouncer есть несколько режимов работы(соединений) в них стоит разобраться.
...
Рейтинг: 0 / 0
08.12.2020, 11:19
    #40025526
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объйсните почему так происходит
kliff,

pgbouncer от idle in transaction не поможет
он помогает для расшаривания сотен-тысяч idle соединений на 1-10 реальных коннектов к базе
а вот idle in transaction это уже соединение с базой занято до окончания транзакции.

Так что pgbouncer вам поможет только убрать те 100 что в idle.

idle in transaction всегда проблема приложения и там ее и надо лечить путем анализа почему оно возникает.
В 99% случаев оно возникает когда приложение внутри транзакции начинает к каким то тормозящим внешним ресурсам обращаться что является очень плохой практикой.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
09.12.2020, 08:26
    #40025857
kliff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объйсните почему так происходит
Maxim Boguk, большое спасибо!
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Объйсните почему так происходит / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]