2016-11-08 2 views
0

Ich muss Tabelle in Postgres gleichzeitig durch die Verwendung mehrerer Verbindungen aber im Rahmen der einzelnen Transaktion zu füllen. Ist es möglich?Ist es möglich, mehrere Verbindungen pro Transaktion in Postgres? Golang Verwendung

Ich sehe keine Möglichkeit, diesen Engpass zu vermeiden.

Dank

+0

Ich glaube nicht ist möglich, eine Transaktion über verschiedene Verbindungen zu teilen. Bitte erläutern Sie besser, was Sie tun möchten, vielleicht fügen Sie ein Beispiel hinzu, um es einfach zu verstehen. –

+0

Ich habe einen Golang-Befehl, der Satz von CSV-Dateien analysiert und entsprechende Tabellen in der Datenbank auffüllt. Diese Dateien sind sehr groß. Parser liest Dateien Zeile für Zeile und legt sie in den Kanal. Vier goroutines nimmt diese Ergebnisse von einem Kanal und macht Exec(). Wenn ich db.Exec() mache dauert der gesamte Prozess 25 Minuten, wenn tx.Exec() mehr als 4 Stunden. – MasterJ

+0

außerdem kann ich nicht verschiedene Dateien in verschiedenen Transaktionen fortfahren, weil die Behandlung der aktuellen Datei Änderungen sehen muss, die von früheren Dateien gemacht wurden. (Postgres unterstützt nicht READ UNCOMMITED) Als Ergebnis für den gesamten Prozess kann ich nur eine Verbindung verwenden. – MasterJ

Antwort

0

Ich bin zuversichtlich, dass die Transaktion nicht brauchen.

Aber wenn viel wollen - Sie eine Staging-Tabelle machen können, füllen Sie es mit mehreren Routinen, und dann in einem Transaktionsdaten in der Masse übertragen unter Verwendung eines solchen „Einfügen von ausgewählten“

+0

Danke. Ich habe auch darüber nachgedacht. Aber warum glaubst du, dass diese Transaktion nicht nötig war? Durch Anforderungen, wenn Prozess in einem Punkt fehlschlägt, sollten wir Datenbank in der vorherigen Bedingung erhalten. – MasterJ

+0

Ich nehme an, dass Sie die erforderlichen Prüfungen für die heruntergeladenen Daten durchführen, die sich nicht in der Geschäftslogikebene oder in der Stufentabelle befinden, und laden Sie sie dann außerhalb der Transaktion. In jedem Fall führt eine lang andauernde Transaktion über große Datenmengen zu einer Verschlechterung des Leistungs-DBMS. –

+0

Sie können versuchen, mit den Dämmstärken zu spielen. 1. Wählen Sie die gewünschte Anzahl von Verbindungen (die Anzahl der Threads). Setzen Sie sie auf die Isolationsstufe "Read uncommitted" [link] (https://www.postgresql.org/docs/9.6/static/transaction-iso.html), um die in einem anderen Thread vorgenommenen Änderungen zu sehen. 2. In jedem von sie starten eine Transaktion 3. Wenn der Thread Daten laden beendet, muss er auf die anderen warten und hat die Transaktion nicht committed 4. Wenn alle Threads fertig sind - führen Sie Commit bei allen Threads. Bei SQL-Fehler in einer der Thread-Rollback-Änderungen an allen Threads. –

Verwandte Themen