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.