Ich arbeite mit PostgreSQL 9.3 unter Verwendung der psycopg2Datenbank-API.
Ich habe die DB-API auf die minimale Isolationsstufe ("Autocommit" -Modus) eingestellt und verwalte meine eigenen Transaktionen direkt über SQL. Beispiel:
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;")
Ist die Transaktion, die von der gestartet wird, cur.execute("BEGIN;")auf diesen Cursor beschränkt, oder gilt sie für die gesamte Verbindung ( self.conn.cursor())?
Einige der komplexeren Dinge, die ich mache, beinhalten mehrere separate Datenbankoperationen, die ich logisch in Funktionen aufteile. Da dies alles in einer Klasse ist, die die Verbindung als Mitglied hat, ist es viel bequemer, innerhalb jeder Funktion Cursor zu erstellen. Ich bin mir jedoch nicht sicher, wie das Erstellen von Cursorn innerhalb einer Transaktion funktioniert.
Grundsätzlich kann ich, wenn Transaktionen pro Verbindung erfolgen, einfach viele Cursor im laufenden Betrieb innerhalb der Transaktion erstellen. Wenn sie pro Cursor sind, bedeutet das, dass ich den Cursor überall herumgeben muss. Welches ist es?
Die Dokumentation berührt dies nicht, obwohl die Tatsache, dass Sie anrufen können, connection.commit()mich ziemlich sicher macht , dass die Transaktionskontrolle pro Verbindung erfolgt.