No PostgreSQL, fazer vários UPDATES para diferentes linhas na mesma tabela com um conflito de bloqueio?

Eu estou um pouco perguntando sobre uma atualização eu estou fazendo uma grande mesa, eu preciso me preocupar com bloqueios.

Eu tenho uma mesa parecida com esta:

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
);

Inicialmente, essa tabela possui ~ 2,0 milhões de linhas, e somente o ID preenchido, WorkerInstanceId e os dois timestamps são nulos por padrão e no início da execução.

O que acontece é que alguns aplicativos de trabalho (pelo menos dois, mas estarão em torno de 10-13 na produção) marcarão um lote de IDs (planejo definir batchSize para 200) desta tabela para processar. O que acontece durante o processamento realmente não importa agora. A marcação de um lote se parece com isso:

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

Minha pergunta é, eu preciso me preocupar sobre o bloqueio das linhas que eu vou atualizar antes de fazer a atualização?

A documentação do Postgres diz:

ROW EXCLUSIVE

Conflitos com os modos de bloqueio SHARE, SHARE ROW EXCLUSIVO, EXCLUSIVO e ACCESS EXCLUSIVE.

Os comandos UPDATE, DELETE e INSERT adquirem esse modo de bloqueio na tabela de destino (além dos bloqueios ACCESS SHARE em qualquer outra tabela referenciada). Em geral, esse modo de bloqueio será adquirido por qualquer comando que modifique os dados em uma tabela.

Então eu acho que sempre que um dos trabalhadores faz essa atualização, toda a tabela é bloqueada, 200 linhas são atualizadas e o bloqueio é liberado no final. Até que a fechadura esteja no lugar, os outros trabalhadores estão esperando a fechadura para liberar. Estou certo ou sinto falta de alguma coisa?

Obrigado pela ajuda!

questionAnswers(2)

yourAnswerToTheQuestion