相关疑难解决方法(0)

多个线程可以在约束集上导致重复更新吗?

在postgres中,如果我运行以下语句

update table set col = 1 where col = 2
Run Code Online (Sandbox Code Playgroud)

在默认READ COMMITTED隔离级别,来自多个并发会话,我保证:

  1. 在单个匹配的情况下,只有1个线程将获得ROWCOUNT为1(意味着只有一个线程写入)
  2. 在多匹配的情况下,只有1个线程将获得ROWCOUNT> 0(意味着只有一个线程写入批处理)

postgresql transactions isolation-level

6
推荐指数
1
解决办法
1919
查看次数

在PostgreSQL中,对同一表中不同行的多个UPDATE是否存在锁定冲突?

我有点想知道我正在做一张大桌子的更新,我是否需要担心锁。

我有一张桌子,看起来像这样:

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行,最后释放该锁。在锁到位之前,其他工人正在等待锁释放。我是对的还是我想念什么

谢谢您的帮助!

postgresql locking

1
推荐指数
1
解决办法
3295
查看次数