Ich arbeite mit PHP 7 (5.6.11) und PostgreSQL 9.4 auf Ubuntu 15.10 und Freebsd.Wie erkennen Sie, warum Sperren Tabelle Zeile?
Mein Code wählen Sie eine Zeile nach ID aus der Tabelle mit "für Update" -Option. Manchmal (ein Fall von Hunderten) führt diese Abfrage sehr lange Zeit aus, ungefähr 20-90 Sekunden. Mein Code arbeitet in etwa 30 Threads.
Wie ich verstehe, "wählen * aus der Tabelle für die Aktualisierung" Sperre nur einzelne Zeile in der Tabelle und ich kann solches Verhalten nur erhalten, wenn ein anderer Prozess diese Zeile bereits auswählen. Habe ich recht? Es kann jedoch nicht passieren, da das Skript erst ausgeführt wird, nachdem eine Nachricht vom Nachrichtenbroker erhalten wurde.
Einzelne Nachricht für eine Zeile. Ich kann mir also nicht vorstellen, wer und warum diese Reihe blockieren kann. (select * from table for update
an einer Stelle verwendet, wo ich eine Nachricht aus der Warteschlange bekomme).
Ich versuche, Informationen von pg_locks und psax Ausgang zu verwenden. Ich speichere diese Information, bevor ich für die Aktualisierung auswähle, und dann, wenn ich eine lange Abfrage abfinde, sende ich diese Information in den Protokollen. Ich sehe pid des Prozesses, der Tabelle sperrt, aber ich sehe diese PID in ps ax Ausgabe nicht. Das verwirrt mich.
Hat jemand eine Idee?
Sie müssen dafür Dokumentation bereitstellen. Angenommen, dies ist die einzige Abfrage, die in diesem Moment "pausiert", dann klingt es nach Locking. Ich habe jedoch noch nie gehört, dass ein Schloss nicht in pg_locks aufgeführt ist. –