Продолжаю изучение конфигурационных параметров PostgreSQL. Следующий на очереди – max_prepared_transactions.
Конфигурационные параметры PostgreSQL лежат в каталоге с данными (PGDATA) в файле postgresql.conf.
- Параметр: max_prepared_transactions
- Раздел: Использование ресурсов / Память
- Изменение: postmaster, требуется перезапуск сервера для применения нового значения
- Принимаемое значение: integer
- Минимальное значение: 0 (если указан ноль – тогда механизм подготовки транзакций не заработает)
- Максимальное значение: 262143
- Значение по умолчанию: 0
- Как посмотреть:
- Команда: SHOW max_prepared_transactions
-
-
- Запрос: select * from pg_settings s where name = ‘max_prepared_transactions’
-
- Особенности:
- max_prepared_transactions используется в механизме двухфазных коммитов (2PC). Сам я этот механизм не трогал. Чуть подробнее можно почитать тут.
Если вкратце: есть диспетчер и участники процесса. Изменяются данные, которые должны быть сохранены у всех участников. На участниках подготавливаются транзакции. Я так понимаю, они выполняются, но их статус не подтверждается. Если участник может гарантировать, что закоммитит изменения, тогда он отправляет такой сигнал диспетчеру. После того, как все участники успешно ответили диспетчеру, он отправляет сигнал о фиксации распределенной транзакции. И все участники должны зафиксировать свои подготовленные транзакции.
Если хотя бы один из участников ответит диспетчеру (на первом шаге) что не может зафиксировать транзакцию, диспетчер отправит всем команду на откат.
И наше значение в max_prepared_transactions – это и есть число таких распределенных транзакций.
Вот как-то так это работает.
- Опять же, как я понял, для реализации этого механизма нужны несколько участников, которые должны быть не на сервере. У меня пока таких ресурсов нет, поэтому посмотреть не смог. Но некоторые шаги можно увидеть.
Список подготовленных транзакций лежит во вьюшке pg_prepared_xacts.
Укажем в max_prepared_transactions, например, 10, начнем транзакцию (begin), подготовим ее для двухфазной фиксации (prepare transaction) и проверим результат:
Как будто бы подготовленная транзакция есть, но командой rollback prepared не откатывается. Когда-нибудь протестирую подробнее.
- [пока непонятное для меня] При указании большого разрешенного значения, например, 200 000 (100 000) под max_prepared_transactions, сервер не стартует. Разные ошибки выдает, но все они связаны с тем, что PostgreSQL не может выделить память:
Находил в интернете старую информацию, что каждое увеличение max_prepared_transactions «тратит» 600 байт из общей памяти (а сейчас, наверное, больше). То есть, если поставить большое значение, под max_prepared_transactions сразу резервируется память.
Leave a Reply