Deadlock in PL / pgSQL-Funktion erkannt

8

Ich stehe vor einem Deadlock-Problem von einer PL / pgSQL-Funktion in meiner PostgreSQL-Datenbank. Finden Sie die SQL-Anweisung im Codeblock (nur Beispiel):

%Vor%

Ich habe festgestellt, dass der Deadlock aufgetreten ist, während diese Anweisung ausgeführt wurde. Aber ich bin mir nicht sicher, ob es andere Anweisungen gab, die versuchten, diese Tabelle zur gleichen Zeit zu aktualisieren (weil ich keine in meinem Logging-System gefunden hatte).

Also, ist es möglich, dass der Deadlock innerhalb dieser Aussage aufgetreten ist? Soweit ich weiß, wenn wir die ganze Aussage mit BEGIN / END blockiert haben. Es wird die gleiche Transaktion und sollte nicht von selbst gesperrt werden.

    
Sathapanic Sriprom 09.04.2012, 17:55
quelle

3 Antworten

11

Es gibt definitiv einen anderen Prozess , der um dieselbe Ressource konkurriert. Das ist die Natur einer Sackgasse. Eine Funktion wie Sie kann sich niemals selbst blockieren. Siehe Kommentar von @kgrittn , der ein Experte für Parallelität in PostgreSQL ist.

Ihre Version von PostgreSQL fehlt. Moderne Versionen verursachen eine detaillierte Fehlermeldung . Beide Prozesse, die um Ressourcen konkurrieren, werden detailliert mit Standardprotokolleinstellungen aufgeführt. Überprüfen Sie Ihre Datenbankprotokolle.

Die Tatsache, dass Sie den Fehler bemerken, kann Postgres davon abhalten, Ihnen die vollständigen Details zu geben. Entfernen Sie den Block EXCEPTION aus Ihrer Funktion plpgsql, wenn Sie die Informationen im db-Protokoll nicht abrufen, und versuchen Sie es erneut.

Um Deadlocks zu vermeiden, können Sie eine Reihe von Dingen tun. Wenn alle Clients in einer synchronisierten Reihenfolge auf Ressourcen zugreifen, können keine Deadlocks auftreten. Das Handbuch enthält die grundlegende Strategie zur Lösung der meisten Fälle im Kapitel über Deadlocks .

Wie für Version 8.3 : Erweitern Sie das Upgrade auf eine neuere Version. Insbesondere diese Verbesserung in Version 8.4 dürfte für Sie interessant sein ( Zitate aus den Release Notes ):

  

Wenn Sie einen Deadlock melden, melden Sie den Text aller Abfragen, die involviert sind   der Deadlock zum Serverlog (Itagaki Takahiro)

Auch die Version 8.3 wird ihrem Ende des Lebens im Februar 2013 entsprechen. Sie sollten mit der Aktualisierung beginnen.

Eine Deadlock-Situation mit VACUUM hätte in 8.3.1 behoben werden müssen .

    
Erwin Brandstetter 09.04.2012, 18:08
quelle
0

Sie würden kein Deadlock-Problem bekommen, wenn Sie commit hinzufügen, um exklusive Sperren freizugeben.

%Vor%     
jimmy chen 17.01.2014 05:14
quelle
-1

In PostgreSQL bedeutet "begin", dass Sie die Batch-Transaktion starten.

Ihre erste Aktualisierung wird Zeilen für Konten sperren WHERE acct_name like 'A%'; Diese Zeilen sind nach dem ersten Update exklusiv gesperrt.

Das zweite Update versucht, genau dieselben Zeilen zu öffnen wie das erste Update, um es zu aktualisieren scheitern, weil das erste Update noch NICHT durchgeführt wurde.

Somit war der zweite Update-Hit-Deadlock Rollback.

    
jimmy chen 17.01.2014 05:04
quelle