我想知道我正在对一张大表进行更新,以及我是否需要担心锁定。
我有一张看起来像这样的表:
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
);
最初,该表有大约 200 万行,并且仅填充了
id
列 - WorkerInstanceId
和两个时间戳在默认情况下和运行开始时都是 NULL
。发生的情况是一些工作应用程序(至少两个,但在生产中大约有 10-13 个)将从该表中标记一批 ID(我计划将 batchSize 设置为 200)以供它们处理。现在处理过程中发生的事情并不重要。
批次的标记如下所示:
UPDATE "ItemsToProcess"
SET "WorkerInstanceId" = ?, "ProcessingStartTime" = current_timestamp()
WHERE "WorkerInstanceId" is NULL
LIMIT 200;
我的问题是,在进行更新之前,我是否需要担心锁定要更新的行?
Postgres 文档说:
所以我认为每当其中一个工作人员进行此更新时,整个表都会被锁定,更新 200 行,最后释放锁。在锁到位之前,其他 worker 正在等待锁被释放。这是正确的还是我错过了什么?
最佳答案
你错过了几件事。
首先,PostgreSQL 不提供用于更新的 LIMIT
选项。请参阅 docs for UPDATE 。
其次,注意ROW EXCLUSIVE
与自身并不冲突,它与不同的SHARE ROW EXCLUSIVE
发生冲突。因此,您的 UPDATE
语句可以安全地从多个 worker 并发运行。您仍然希望更新时间较短。但是,如果遇到问题,您已经有一种内置方法可以通过降低 batchSize
来调整它。
关于postgresql - 在 PostgreSQL 中,对同一个表中不同行的多个 UPDATE 是否有冲突的锁?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11761281/