Für meine Hi/Lo-Implementierung benötige ich eine Funktion, die exklusive Tabellensperre erhält, Wert aktualisiert und eine Zeile auswählt. Ich kam mit dem folgenden Code auf:Postgresql-Funktion, die Tabelle sperrt, Wert aktualisiert und Zeile zurückgibt
CREATE OR REPLACE FUNCTION bb_next_hi(tbl varchar(35))
RETURNS setof record AS
$$
LOCK TABLE hilo IN ACCESS EXCLUSIVE MODE;
OPEN ref FOR SELECT hi as "Hi", lo as "Lo", "table" as "Table" FROM hilo WHERE "table" = $1;
UPDATE hilo SET hi = hi + 1 WHERE "table" = $1
RETURN ref;
$$ LANGUAGE plpgsql;
Wenn jedoch die Funktion aufgerufen wird, gibt sie keine Zeile, sondern eine Säule mit einem Inhalt ähnlich dem „unnamed Portal 3“. Ich denke, ich sollte über zurückgegebene Ref (aber wie) iterieren?
Ein anderer Ansatz, den ich verwenden könnte, ist, UPDATE RETURNING-Anweisung zu verwenden, aber ich bin mir nicht sicher, ob Race-Bedingungen in diesem Fall auftreten können. Jede Hilfe wäre willkommen. Dank
Warum sperren Sie die gesamte Tabelle, wenn Sie nur eine einzelne Zeile sperren möchten? –
Ich denke, es gibt keine andere Möglichkeit, Leser zu sperren. Vielleicht irre ich mich und missverstand etwas, wäre für eine Erklärung gut, wenn das so wäre :) – Davita