在postgres中,如果我运行以下语句
update table set col = 1 where col = 2
Run Code Online (Sandbox Code Playgroud)
在默认READ COMMITTED隔离级别,来自多个并发会话,我保证:
我有点想知道我正在做一张大桌子的更新,我是否需要担心锁。
我有一张桌子,看起来像这样:
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
);
Run Code Online (Sandbox Code Playgroud)
最初,此表中有〜200万行,并且默认情况下以及运行开始时,仅填充的ID,WorkerInstanceId和两个时间戳为null。
发生的情况是,某些工作人员应用程序(至少两个,但在生产中大约为10-13)会从该表中标记一批ID-s(我计划将batchSize设置为200)进行处理。处理过程中发生的事情现在并不重要。批处理的标记如下所示:
UPDATE "ItemsToProcess"
SET "WorkerInstanceId" = ?, "ProcessingStartTime" = current_timestamp()
WHERE "WorkerInstanceId" is NULL
LIMIT 200;
Run Code Online (Sandbox Code Playgroud)
我的问题是,在进行更新之前,我是否需要担心锁定要更新的行?
Postgres文档说:
排他性
与SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVE和ACCESS EXCLUSIVE锁定模式冲突。
命令UPDATE,DELETE和INSERT在目标表上获得此锁定模式(除了对任何其他引用表的ACCESS SHARE锁定之外)。通常,任何修改表中数据的命令都将获取此锁定模式。
因此,我认为每当一个工作人员进行此更新时,整个表将被锁定,将更新200行,最后释放该锁。在锁到位之前,其他工人正在等待锁释放。我是对的还是我想念什么
谢谢您的帮助!