Frage

Für meine Implementierung muss ein bestimmter Schreibvorgang in großen Mengen erfolgen, ohne dass die Möglichkeit einer anderen Störung besteht.

Ich bin gewesen erzählt dass zwei konkurrierende Transaktionen auf diese Weise dazu führen, dass die erste die zweite blockiert, und dass die zweite möglicherweise nach der ersten abgeschlossen wird oder auch nicht.

Bitte veröffentlichen Sie die Dokumentation, die dies bestätigt.Und was passiert genau mit der zweiten Transaktion, wenn die erste blockiert?Wird es in der Warteschlange stehen, fehlschlagen oder eine Kombination daraus sein?

Wenn dies nicht bestätigt werden kann, sollte die Transaktionsisolationsstufe für diese Transaktion auf festgelegt werden SERIALIZABLE?Wenn ja, wie kann das mit vorbereiteten libpqxx-Anweisungen erfolgen?

Wenn die Transaktionen serialisiert sind, schlägt dann die zweite Transaktion fehl oder bleibt sie in der Warteschlange, bis die erste abgeschlossen ist?

Wenn beides fehlschlägt, wie kann dies mit libpqxx erkannt werden?

War es hilfreich?

Lösung

Die einzige Möglichkeit, Parallelitätseffekte schlüssig zu verhindern, besteht darin, Folgendes zu tun: LOCK TABLE ... IN ACCESS EXCLUSIVE MODE jede Tabelle, die Sie ändern möchten.

Das bedeutet, dass Sie eigentlich immer nur eine Sache gleichzeitig tun.Es führt auch zu lustigen Problemen mit Deadlocks, wenn Sie Ihre Sperren nicht immer in der gleichen Reihenfolge erhalten.

Normalerweise müssen Sie also herausfinden, welche Vorgänge genau Sie ausführen möchten und wie sie interagieren.Bestimmen Sie, welche Parallelitätseffekte Sie tolerieren können und wie Sie diejenigen verhindern können, die Sie nicht tolerieren können.

Diese Frage ist in ihrer jetzigen Form einfach zu weit gefasst, als dass sie sinnvoll beantwortet werden könnte.

Zu den Optionen gehören:

  • Ausschließlich verschließbare Tische.(Dies ist das einziger Weg um derzeit einen mehrzeiligen Upsert ohne Parallelitätsprobleme in PostgreSQL durchzuführen).Achten Sie auf Sperraktualisierungen und Sperrreihenfolgen im Zusammenhang mit Deadlocks.

  • angemessene Verwendung von SERIALIZABLE Isolation – aber denken Sie daran, Sie müssen in der Lage sein, aufzuzeichnen, was Sie während einer Transaktion getan haben, und es erneut zu versuchen, wenn die Übertragung abgebrochen wird.

  • Sorgfältiges Sperren auf Zeilenebene – SELECT ... FOR UPDATE, SELECT ... FOR SHARE.

  • Gegebenenfalls „Optimistisches Sperren“ / optimistische Parallelitätskontrolle

  • Schreiben Sie Ihre Abfragen so, dass sie für den gleichzeitigen Betrieb benutzerfreundlicher sind.Ersetzen Sie beispielsweise Lese-, Änderungs- und Schreibzyklen durch direkte Aktualisierungen.

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