Ich arbeite mit PostgreSQL 9.3 unter Verwendung der psycopg2
Datenbank-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.
quelle
begin
. Wenn keine Transaktion geöffnet ist, wird eine neue für Sie gestartet. Sie nurcommit
um Transaktionen abzugrenzen. Also ja, das DB-API - Modell macht explizite Transaktionen zu unterstützen.BEGIN
. Ich möchte nichtpsycopg2
für jede eine neue Transaktion erstellenSELECT
.BEGIN
harmlos und wird von PostgreSQL mit einfach ignoriertWARNING: there is already a transaction in progress
.Aus der psycopg2- Dokumentation:
Gleichzeitig gibt es ab Version 2.4.2 das
autocommit
Attribut (Hervorhebung hinzugefügt):quelle