Frage

techdetail

  • Go Version 1.2
  • posetrres library für go bmizerany / pq

Dieses Problem macht mich verrückt, und ich hoffe, dass jemand helfen kann.

Ich habe einen Antrag in Golang entwickelt, um Daten aus einer Postgres-Datenbank zu lesen und für jeden Datensatz eine HTTP-Anforderung zu erstellen und dann die Datenbank aktualisieren.

Das ist alles einfach genug. Wir haben jedoch einen PgBouncer an Ort und Stelle. Die Konfiguration, die wir für PGBOUNK haben, ist derart, dass es keine vorbereiteten Anweisungen unterstützt. Gehen Sie schweigend alle Anfragen in einer vorbereiteten Anweisung. Die Umgebung für Pgbouncer ist es, eine Transaktion einzurichten. Das ist alles gut und gut für Dinge wie einfügen / update / löschen.

Im Falle der SELECT-Anweisung gehe ich in der Transaktion:

generasacodicetagpre.

(hhmm, das scheint das eingereifte ein wenig zu werfen) Arsch Sie können sehen, dass ich beginne, die Transaktion nicht zu schließen. Dies führt zu einem Problem in der PG-Seite der Dinge, in denen jede Auswahl in einem Zustand im Leerlauf in der Transaktionsstelle verlinkt ist.

Ich habe tx.commit () und tx.rollback () ausprobiert, und in beiden Fällen erhalte ich Fehler:

generasacodicetagpre.

oder

generasacodicetagpre.

ho, schließe ich die Transaktion erfolgreich in los? Ich hoffe, dass unser Pgbounce.ini aktualisiert wird, um mir zuzulassen, dass ich für die Treiberbibliothek auf lib / pq wechseln kann, aber ich bin mir nicht sicher, ob das dieses Problem direkt hilft.

Also, wie schließe ich das TX-Objekt ordnungsgemäß ein oder gibt es einen Weg, um zu zwingen, nicht mit vorbereiteten Anweisungen unter der Haube zu verwenden?

danke Nathan

Ich habe versucht, die Dinge ein bisschen zu ändern:

generasacodicetagpre.

Was ich in den Protokollen mit diesem Code sehe:

generasacodicetagpre.

Ich sollte jedoch darauf hinweisen, dass dies beim Versuch einer SELECT-Anweisung zum zweiten Mal ist. Diese Anwendung wählt eine Stapel aus, befasst sich damit und wählt dann einen nachfolgenden Charge aus. Dieser Fehler tritt bei der zweiten Auswahl aus. Mit der ersten Auswählen gibt es keine Probleme.

War es hilfreich?

Lösung

Für alle anderen, die dies trifft, habe ich das gelöst.

Der Code, den ich hatte, gab das Zeilenobjekt auf den anrufenden Code (nicht gezeigt) oben zurück.Die Transaktion zu schließen, bevor die Reihen gelesen wurden, schien die Ursache des Problems zu sein.Ich verstehe nicht ganz klar, warum also bitte klären, wenn Sie dies tun.

Ich bringe jetzt beide Zeilen als auch das Transaktionsobjekt zurück.Wenn ich dann alle Zeilen gelesen habe, rollte ich die Transaktion.Dies hält alles, was funktioniert.

danke Nathan

Andere Tipps

tx.query Gibt eine Instanz von SQL.ROWS zurück, die ein Cursor für das Ergebnissatz ist.Die Daten wurden nicht unbedingt abgerufen, während Sie diesen Cursor itertieren.Die Transaktion muss während des iteratierenden Cursors offen bleiben.

Aus diesem Grund könnten Sie den Cursor nicht mehr iterieren, sobald die Transaktion geschlossen wurde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top