В какой таблице я могу найти параметры незафиксированной транзакции в postgres

#postgresql

Вопрос:

Если я начну транзакцию в базе данных Postgres, я смогу найти ее в таблице pg_stat_activity. Чтобы получить незафиксированную транзакцию, я использую следующий запрос:

 from pg_stat_activity where (state = 'idle in transaction')  and xact_start is not null  

Это дает что-то вроде этого:

 datid | 16397 datname | msmith pid | 39437 leader_pid |  usesysid | 16396 usename | msmith application_name | PostgreSQL JDBC Driver client_addr | 127.0.0.1 client_hostname |  client_port | 58411 backend_start | 2021-11-24 09:07:06.571559 01 xact_start | 2021-11-24 09:07:22.584942 01 query_start | 2021-11-24 09:07:31.82002 01 state_change | 2021-11-24 09:07:31.820198 01 wait_event_type | Client wait_event | ClientRead state | idle in transaction backend_xid | 3446 backend_xmin |  query | update students set address_id=$1, age=$2, first_name=$3, last_name=$4 where student_id=$5 backend_type | client backend  

В какой таблице я могу найти параметры для подготовленного заявления (обновите набор студентов address_id=$1, возраст=$2, имя пользователя=$3, имя фамилии=$4, где идентификатор студента=$5)?

Ответ №1:

Это нигде не хранится, и вы не можете его получить.

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

Комментарии:

1. Но когда данные(параметры) передаются на сервер базы данных? Делается ли это при совершении транзакции?

2. Нет, они уже были переданы при выполнении инструкции, и после этого база данных забыла их.

3. Поэтому, если я правильно понял, подготовленное заявление было сделано клиентом в транзакции, и его можно найти в таблице «бездействие в транзакции». Эта инструкция была выполнена клиентом и получена сервером до совершения транзакции.

4. Нет, нет, нет. Шаги следующие: 1. клиент отправляет PREPARE сообщение на сервер, сервер готовит заявление. 2. клиент запускает транзакцию (также может произойти до 1.) 3. клиент отправляет BIND сообщение серверу, содержащее параметры 4. клиент отправляет EXECUTE сообщение серверу, сервер выполняет инструкцию и отправляет результаты клиенту. Теперь сервер ждет следующего заявления. У него больше нет параметров.