PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wann wird für die Update-Sperre und -Entsperrung ausgewählt?

Sperren werden während (normalerweise am oder kurz vor dem Beginn) der Ausführung eines Befehls gesetzt. Sperren (außer Hinweissperren) werden nur freigegeben wenn eine Transaktion festgeschrieben oder zurückgesetzt wird. Es gibt kein FOR UNLOCK , noch gibt es ein UNLOCK Befehl, um die Auswirkungen des LOCK auf Tabellenebene umzukehren Befehl. Dies alles wird im Abschnitt Parallelitätssteuerung der PostgreSQL-Dokumentation erklärt.

Sie müssen Ihre Transaktion festschreiben oder rückgängig machen, um Sperren aufzuheben.

Außerdem ist es nicht wirklich sinnvoll zu fragen, ob diese Zeile bereits durch eine andere gleichzeitige Transaktion gelöscht wurde. Sie wird nicht wirklich gelöscht, bis die Transaktion, die die Zeile gelöscht hat, festgeschrieben wird ... und selbst dann könnte sie die Zeile gelöscht und neu eingefügt haben, oder eine andere gleichzeitige Transaktion könnte die Zeile erneut eingefügt haben.

Bauen Sie zufällig ein Aufgabenwarteschlangen- oder Nachrichtenwarteschlangensystem, denn wenn ja, ist dieses Problem gelöst und Sie sollten nicht versuchen, dieses ungewöhnlich komplizierte Rad neu zu erfinden. Siehe PGQ, ActiveMQ, RabbitMQ, ZeroMQ usw. (Zukünftige PostgreSQL-Versionen können FOR UPDATE SKIP LOCKED enthalten da dies getestet wird, aber zum Zeitpunkt des Schreibens noch nicht veröffentlicht wurde).

Ich schlage vor, dass Sie eine neue Frage mit einer detaillierteren Beschreibung des zugrunde liegenden Problems posten, das Sie zu lösen versuchen. Sie gehen davon aus, dass die Lösung für Ihr Problem "herausfinden, ob die Zeile bereits gelöscht wurde" oder "Zeile entsperren" lautet. Das ist wahrscheinlich nicht wirklich die Lösung. Es ist ein bisschen so, als würde jemand sagen:"Wo kaufe ich Benzin?", wenn sein Laufrad nicht fährt, also nehmen sie an, dass es keinen Kraftstoff mehr hat. Kraftstoff ist nicht das Problem, das Problem ist, dass Laufräder keinen Kraftstoff verbrauchen und Sie sie treten müssen.

Erklären Sie die Hintergründe. Erklären Sie, was Sie erreichen wollen. Posten Sie vor allem keinen Pseudocode, posten Sie den eigentlichen Code, mit dem Sie Probleme haben , vorzugsweise in einer eigenständigen und lauffähigen Form.