Как проверить наличие ожидающих операций в транзакции PostgreSQL - PullRequest
16 голосов
/ 30 октября 2009

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

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

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

Ответы [ 3 ]

9 голосов
/ 31 октября 2009

Начните с проверки в системном представлении pg_locks.

http://www.postgresql.org/docs/8.4/interactive/view-pg-locks.html

3 голосов
/ 02 марта 2015

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

select txid_current();

begin;

select txid_current();

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

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

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

0 голосов
/ 31 октября 2009

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

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

...