我想知道我正在对一张大表进行更新,以及是否需要担心锁。
我有一张看起来像这样的桌子:
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 文档说:
排独家
与 SHARE、SHARE ROW EXCLUSIVE、EXCLUSIVE 和 ACCESS EXCLUSIVE 锁模式冲突。
命令 UPDATE、DELETE 和 INSERT 在目标表上获取此锁定模式(除了任何其他引用表上的 ACCESS SHARE 锁定)。一般来说,任何修改表中数据的命令都会获得这种锁定模式。
所以我认为,每当其中一个工作人员进行此更新时,整个表都会被锁定,更新 200 行并最终释放锁定。在锁到位之前,其他工作人员正在等待锁释放。这是对的还是我错过了什么?