2009-10-30 12 views
14

Mam sesję (SQLAlchemy) na PostgreSQL z aktywną niezakonkludowaną transakcją. Właśnie przekazałem sesję do drzewa wywołań, które mogło lub nie mogło wydać instrukcji SQL, poprzez lub bezpośrednio przez podstawowe połączenie.Jak sprawdzić oczekujące operacje w transakcji PostgreSQL

Czy istnieje sposób sprawdzenia, czy w tej transakcji są jakieś oczekujące instrukcje modyfikujące dane? To znaczy. czy commit byłby "no-op" czy nie, i czy rollback mógłby coś odrzucić, czy nie?

Widziałem ludzi, którzy wskazują Oracle v$transaction na to samo (patrz this SO question). Szukam czegoś podobnego do użycia w PostgreSQL.

Odpowiedz

0

Nie, nie z poziomu bazy danych, naprawdę. Być może możesz dodać trochę śledzenia na poziomie sqlalchemy, aby go śledzić?

Jak zdefiniować no-op? Co się stanie, jeśli zaktualizujesz wartość do tej samej wartości, która była wcześniejsza, czy to nie jest opcja czy nie? Z perspektywy baz danych, gdyby miał, nie byłby to tryb "no-op". Ale z perspektywy aplikacji prawdopodobnie tak by było.

+0

Nadmiarowy zapis również byłby "no-op", z pewnością, ale nie chcę tego wykrycia (więcej kosztu niż wartości). Chcę tylko wiedzieć, czy transakcja ma jakiekolwiek operacje zapisu/usuwania, nieskuteczne czy nie. –

2

rozważyć następującą sekwencję instrukcji:

select txid_current(); 

begin; 

select txid_current(); 

Jeśli identyfikator transakcji zwrócone przez dwa wybiera jest równa, to jest w zwykłych warunkach. Jeśli nie, to nie było (teraz jest).

Jeśli liczby są różne, to jako efekt uboczny po prostu otworzysz transakcję, którą prawdopodobnie zechcesz zamknąć.

UPDATE W rzeczywistości, jak @ r2evans zwraca uwagę (dzięki za wgląd!), Nie trzeba się „begin” - txid_current() zwróci ten sam numer tylko jeśli jesteś w transakcji .

+0

Być może nie potrzebujesz 'begin': jeśli dwa dwa kolejne zapytania' select txid_current(); ', jeśli zwracają ten sam numer, niż obecnie w transakcji. – r2evans

Powiązane problemy