Pracuję z PostgreSQL 9.3 przy użyciu psycopg2
interfejsu API bazy danych.
Mam interfejs API DB ustawiony na minimalnym poziomie izolacji (tryb „automatycznego zatwierdzania”) i zarządzam własnymi transakcjami bezpośrednio przez SQL. Przykład:
cur = self.conn.cursor()
cur.execute("BEGIN;")
cur.execute("SELECT dbId, downloadPath, fileName, tags FROM {tableName} WHERE dlState=%s".format(tableName=self.tableName), (2, ))
ret = cur.fetchall()
cur.execute("COMMIT;")
Zasadniczo, czy transakcja, która jest uruchamiana przez cur.execute("BEGIN;")
ograniczenie do tego samego kursora, czy też dotyczy całego połączenia ( self.conn.cursor()
)?
Niektóre bardziej złożone rzeczy, które robię, obejmują wiele oddzielnych operacji na bazie danych, które logicznie dzielę na funkcje. Ponieważ jest to wszystko w klasie, która ma połączenie jako członek, o wiele wygodniej jest tworzyć kursory w ramach każdej funkcji. Nie jestem jednak pewien, jak działa tworzenie kursorów w ramach transakcji.
Zasadniczo, jeśli transakcje dotyczą jednego połączenia, mogę po prostu utworzyć wiele kursorów w locie w ramach transakcji. Jeśli są na kursor, oznacza to, że muszę przesuwać kursor wszędzie. Który to jest?
Dokumentacja tego nie dotyczy, chociaż fakt, że możesz zadzwonić, connection.commit()
daje mi całkowitą pewność, że kontrola transakcji dotyczy każdego połączenia.
źródło
begin
. Jeśli żadna transakcja nie jest otwarta, rozpoczyna się nowa. Po prostucommit
wytycz transakcje. Więc tak, model DB-API robi wsparcia jawnych transakcji.BEGIN
instrukcji. Nie chcępsycopg2
tworzyć nowej transakcji dla każdej z nichSELECT
.BEGIN
jest nieszkodliwy i zostanie po prostu zignorowany przez PostgreSQLWARNING: there is already a transaction in progress
.Z dokumentacji psycopg2 :
Jednocześnie od wersji 2.4.2 istnieje
autocommit
atrybut (dodano wyróżnienie):źródło