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

StackOverflow https://stackoverflow.com/questions/1651219

Вопрос

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

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

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

Это было полезно?

Решение

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

http://www.postgresql.org/docs/ 8.4 / интерактивный / вид-пг-locks.html

Другие советы

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

select txid_current();

begin;

select txid_current();

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top