psycopg2.InternalError

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
andi24
User
Beiträge: 56
Registriert: Freitag 5. März 2010, 11:42

Hallo zusammen,

ich bekomme beim Schicken einer SQL-Abfrage von Python aus an eine Postgres-DB folgende Fehlermeldung:

Code: Alles auswählen

psycopg2.InternalError: current transaction is aborted, commands ignored until end of transaction block
Der Code selbst macht eigentlich nix wildes und hat bisher auch immer funktioniert. Er sieht in etwa so aus:

Code: Alles auswählen

sql="""SELECT * from tabelle where 
         ... """
  
        curs.execute(sql)
        row = curs.fetchall()

Kann mir da jemand weiterhelfen??

Viele Grüße und vielen Dank!!

Andi
Zuletzt geändert von andi24 am Dienstag 13. Juli 2010, 13:53, insgesamt 2-mal geändert.
andi24
User
Beiträge: 56
Registriert: Freitag 5. März 2010, 11:42

Ich habe mittlerweile gelesen, dass bei diesem Problem ein "Rollback()", bzw. ein "Commit()" weiterhelfen könnte. Wäre das möglich? Wie würde man das denn in diesem Fall anwenden? Müsste ich dann für jedes curs.execute einen try-except-Block errichten und in den except-Teil ein commit schreiben?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wann kommt den der Fehler? Nach dem execute oder dem fetch?

Außerdem wäre es gut, wenn du den ganzen Code zeigen würdest (also inkl. Aufbau der Verbindung zu DB).

Lt. Google-Suche kann dieser Fehler auch auftreten, wenn mehrere Subprozesse parallel eine DB-Verbindung nutzen wollen...Link

Gruß, noisefloor
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Commit bzw. Rollback machen nur Sinn, wenn es zu Änderungen an der DB kommt.
rads
User
Beiträge: 153
Registriert: Freitag 26. März 2010, 15:51

Anbei ein Beispiel mit Rollback (gekürzt)

Code: Alles auswählen

try:
                myCursor.execute(sqlQuery, params)
                ...
                db.commit()
except Exception, e:
                self.log.error ("Error executing SQL Statement \n ( %s ) \n %s" %
                                 (sqlQuery, e))
                db.rollback();
try:
                db.close()
except Exception, err:
                self.log.warning('ERROR: %s\n' % str(err))
An sich wäre interessant, ob der Fehler rekonstruierbar ist. D.h. passiert er z.b. immer bei den gleichen Daten?
Ansonsten könnte es sein, wenn mehrere Threads simultan auf die Datenbank zugreifen, sich vielleicht gegenseitig
blockieren. Sollte aber an sich aufgrund Transaktionssicherheit bei postgres kein Problem sein, wenn sql Transaktionen
korrekt abgeschlossen (commit, close) werden?

psycopg2.InternalError: current transaction is aborted, commands ignored until end of transaction block
Klingt für mich zumindest danach, das während der Ausführung einer Transaktion eine Andere "reinfunkt" (Thema Lost-Update Problem). Besonders bei dem Befehl .execute weiß man ja nicht ob es sich um einen select oder update handelt und so standardmässig abgebrochen wird, könnt ich mir zumindest vorstellen.
Antworten