Как проверить наличие ожидающих операций в транзакции PostgreSQL
-
22-07-2019 - |
Вопрос
У меня есть сеанс (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, чтобы отслеживать ее?
Кроме того, как вы определяете запрет? Что, если вы обновили значение до того же значения, которое оно имело ранее, это не работает или нет? С точки зрения баз данных, если бы он был, он не был бы запретным. Но с точки зрения приложения это, вероятно, будет.