Ich bin mit einem Deadlock-Problem von einer PL/pgSQL-Funktion in meiner PostgreSQL-Datenbank konfrontiert. Sie finden die SQL-Anweisung in dem Codeblock (nur Beispiel):Deadlock in PL/pgSQL-Funktion erkannt
BEGIN
UPDATE accounts SET balance = 0 WHERE acct_name like 'A%';
UPDATE accounts SET balance = balance + 100 WHERE acct_name like '%A';
EXCEPTION WHEN OTHERS THEN RAISE NOTICE SQLERRM;
END;
Ich habe festgestellt, dass der Stillstand in dieser Erklärung aufgetreten 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. Es wird dieselbe Transaktion geben und sollte nicht von selbst gesperrt werden.
Haben Sie Trigger auf Konten? Verwenden Sie auch explizites Sperren? – strkol
Standardmäßig kann eine Transaktion Änderungen beobachten, die von anderen Transaktionen ausgeführt wurden. Weitere Informationen finden Sie unter [Transaktionsisolation] (http://www.postgresql.org/docs/current/static/transaction-iso.html) in der PostgreSQL-Dokumentation. –
@strkol Ja, ich habe, aber die Aussage in diesem Trigger ist nicht mit dieser Tabelle verbunden. Für das explizite Sperren gibt es ja auch. –