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

Sperren Sie die Zeilen, bis Sie zum nächsten Mal Postgres auswählen

Ich glaube nicht, dass dies möglich ist. Sie können einen Nur-Lese-Zugriff auf eine Tabelle nicht blockieren (es sei denn, diese Auswahl erfolgt FOR UPDATE )

Soweit ich das beurteilen kann, besteht die einzige Möglichkeit darin, pg_advisory_lock() zu verwenden Funktion.
http://www .postgresql.org/docs/current/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS

Dies erfordert jedoch eine "manuelle" Freigabe der dadurch erhaltenen Sperren. Sie erhalten damit keine automatische Entsperrung.

Um die Zeilen zu sperren, benötigen Sie etwa Folgendes:

select pg_advisory_lock(id), * 
from 
( 
  select * table1 order by id limit 5
) t

(Beachten Sie die Verwendung der abgeleiteten Tabelle für den LIMIT-Teil. Siehe den manuellen Link, den ich für eine Erklärung gepostet habe)

Dann müssen Sie die abgerufenen IDs speichern und später pg_advisory_unlock() aufrufen für jede ID.

Wenn jeder Prozess immer alle freigibt IDs auf einmal, könnten Sie einfach pg_advisory_unlock_all() verwenden stattdessen. Dann brauchen Sie die abgerufenen IDs nicht zu speichern.

Beachten Sie, dass dies nicht wird verhindern, dass andere die Zeilen mit "normalen" Auswahlen lesen. Es funktioniert nur, wenn jeder Prozess, der auf diese Tabelle zugreift, dasselbe Muster zum Abrufen der Sperren verwendet.