Seite 1 von 1

psycopg2.InternalError

Verfasst: Montag 12. Juli 2010, 15:20
von andi24
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

Re: psycopg2.InternalError

Verfasst: Dienstag 13. Juli 2010, 13:53
von andi24
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?

Re: psycopg2.InternalError

Verfasst: Dienstag 13. Juli 2010, 19:50
von noisefloor
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

Re: psycopg2.InternalError

Verfasst: Mittwoch 14. Juli 2010, 11:42
von mkesper
Commit bzw. Rollback machen nur Sinn, wenn es zu Änderungen an der DB kommt.

Re: psycopg2.InternalError

Verfasst: Mittwoch 14. Juli 2010, 11:44
von rads
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.