Ich habe ein Deadlock-Problem bei einer PL/pgSQL-Funktion in meiner PostgreSQL-Datenbank. Bitte finden Sie die SQL-Anweisung im Code-Block (nur ein Beispiel):
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 Deadlock auftrat, als 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 Protokollierungssystem gefunden habe).
Also, ist es möglich, dass der Deadlock innerhalb dieser Anweisung auftrat? Soweit ich weiß, wenn wir die gesamte Anweisung mit BEGIN
/END
blockieren. Es wird sich um dieselbe Transaktion handeln und sollte nicht von sich selbst gesperrt werden.
0 Stimmen
Hast du Trigger auf Konten? Verwendest du auch explizite Sperrungen?
1 Stimmen
Standardmäßig kann eine Transaktion Änderungen beobachten, die von anderen Transaktionen verpflichtet wurden. Weitere Informationen finden Sie unter Transaktionsisolierung in der PostgreSQL-Dokumentation.
0 Stimmen
@strkol Ja, das habe ich, aber die Aussage in diesem Trigger ist nicht mit dieser Tabelle verbunden. Für das explizite Sperren gilt auch ja.