Ответ 1
Начните с просмотра системного вида pg_locks.
http://www.postgresql.org/docs/8.4/interactive/view-pg-locks.html
У меня есть сеанс (SQLAlchemy) на PostgreSQL с активной незафиксированной транзакцией. Я только что передал сессию в какое-то дерево вызовов, которое могло или не могло выдавать операторы SQL INSERT
/UPDATE
/DELETE
через sqlalchemy.orm
или напрямую через базовое соединение.
Есть ли способ проверить, есть ли в этой транзакции ожидающие изменения данные? То есть то ли commit будет no-op или нет, и будет ли откат что-то отбрасывать или нет?
Я видел, как люди отмечали v$transaction
в Oracle для того же самого (см. этот вопрос SO). Я ищу что-то похожее на использование PostgreSQL.
Начните с просмотра системного вида pg_locks.
http://www.postgresql.org/docs/8.4/interactive/view-pg-locks.html
Рассмотрим следующую последовательность утверждений:
select txid_current();
begin;
select txid_current();
Если идентификатор транзакции, возвращенный двумя выборами, равен, то есть открытая транзакция. Если нет, то не было, (но теперь есть).
Если числа отличаются друг от друга, то в качестве побочного эффекта вы просто открыли транзакцию, которую вы, вероятно, захотите закрыть.
ОБНОВЛЕНИЕ. На самом деле, как указывает @r2evans (спасибо за понимание!), вам не нужно "begin" - txid_current() вернет тот же номер, только если вы находятся в транзакции.
Нет, не из уровня базы данных. Возможно, вы можете добавить трассировку на уровне sqlalchemy для ее отслеживания?
Также, как вы определяете no-op? Что делать, если вы обновили значение до того же самого значения, которое у него было до этого, это то, что нет-op или нет? С точки зрения баз данных, если бы он был один, это не было бы не-op. Но с точки зрения приложения это, вероятно, было бы.