Führen Sie in PostgreSQL mehrere UPDATES für verschiedene Zeilen in derselben Tabelle durch, die einen Sperrkonflikt aufweisen?

Ich wundere mich ein bisschen über ein Update. Ich mache einen großen Tisch. Muss ich mir Sorgen um Sperren machen?

Ich habe eine Tabelle, die so aussieht:

CREATE TABLE "ItemsToProcess"( 
"id" text, 
"WorkerInstanceId" text, 
"ProcessingStartTime" timestamp with time zone, 
"UpdatedTime" timestamp with time zone, 
CONSTRAINT "ITP_PK" PRIMARY KEY ("id")
)WITH (
  OIDS=FALSE
);

Anfänglich enthält diese Tabelle ~ 2,0 Millionen Zeilen, und nur die eingegebene ID WorkerInstanceId und die beiden Zeitstempel sind standardmäßig null und befinden sich zu Beginn des Laufs.

Was passiert, ist, dass einige Worker-Apps (mindestens zwei, aber etwa 10-13 in der Produktion) einen Stapel von IDs (ich plane, batchSize auf 200 zu setzen) aus dieser Tabelle markieren, um sie zu verarbeiten. Was während der Verarbeitung passiert, spielt jetzt keine Rolle mehr. Die Kennzeichnung einer Charge sieht folgendermaßen aus:

UPDATE "ItemsToProcess" 
   SET "WorkerInstanceId" = ?, "ProcessingStartTime" = current_timestamp()
 WHERE "WorkerInstanceId" is NULL
 LIMIT 200;

Meine Frage ist: Muss ich mir Gedanken darüber machen, ob ich die zu aktualisierenden Zeilen sperren muss, bevor ich das Update vornehme?

Postgres Dokumentation sagt:

EXKLUSIVE REIHE

Konflikte mit den Sperrmodi SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE und ACCESS EXCLUSIVE.

Die Befehle UPDATE, DELETE und INSERT erfassen diesen Sperrmodus für die Zieltabelle (zusätzlich zu ACCESS SHARE-Sperren für alle anderen referenzierten Tabellen). Im Allgemeinen wird dieser Sperrmodus von jedem Befehl abgerufen, der die Daten in einer Tabelle ändert.

Ich denke also, dass jedes Mal, wenn einer der Worker dieses Update vornimmt, die gesamte Tabelle gesperrt wird, 200 Zeilen aktualisiert werden und die Sperre am Ende freigegeben wird. Bis das Schloss geschlossen ist, warten die anderen Arbeiter darauf, dass das Schloss frei wird. Habe ich recht oder vermisse ich etwas?

Danke für die Hilfe!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage