Как проверить наличие ожидающих операций в транзакции PostgreSQL

У меня есть сеанс (SQLAlchemy) на PostgreSQL с активной незафиксированной транзакцией. Я только что передал сессию в какое-то дерево вызовов, которое могло или не могло выдавать операторы SQL INSERT/UPDATE/DELETE через sqlalchemy.orm или напрямую через базовое соединение.

Есть ли способ проверить, есть ли в этой транзакции ожидающие изменения данные? То есть то ли commit будет no-op или нет, и будет ли откат что-то отбрасывать или нет?

Я видел, как люди отмечали v$transaction в Oracle для того же самого (см. этот вопрос SO). Я ищу что-то похожее на использование PostgreSQL.

Ответы

Ответ 2

Рассмотрим следующую последовательность утверждений:

select txid_current();

begin;

select txid_current();

Если идентификатор транзакции, возвращенный двумя выборами, равен, то есть открытая транзакция. Если нет, то не было, (но теперь есть).

Если числа отличаются друг от друга, то в качестве побочного эффекта вы просто открыли транзакцию, которую вы, вероятно, захотите закрыть.

ОБНОВЛЕНИЕ. На самом деле, как указывает @r2evans (спасибо за понимание!), вам не нужно "begin" - txid_current() вернет тот же номер, только если вы находятся в транзакции.

Ответ 3

Нет, не из уровня базы данных. Возможно, вы можете добавить трассировку на уровне sqlalchemy для ее отслеживания?

Также, как вы определяете no-op? Что делать, если вы обновили значение до того же самого значения, которое у него было до этого, это то, что нет-op или нет? С точки зрения баз данных, если бы он был один, это не было бы не-op. Но с точки зрения приложения это, вероятно, было бы.