首页 > 解决方案 > 并发创建唯一索引时的 Postgres lock_timeout

问题描述

在表上创建唯一索引时遇到问题。语句失败并显示以下消息

>CREATE UNIQUE INDEX CONCURRENTLY my_table_pkey_new ON my_table (new_id);
ERROR:  canceling statement due to lock timeout

目前尚不清楚为什么我会得到锁定超时。并发索引创建不应锁定表。

我也尝试增加锁定超时但没有成功

test=> show lock_timeout;
 lock_timeout
--------------
 5min
(1 row)

test=> set lock_timeout to 99999999;
SET
test=> show lock_timeout;
 lock_timeout
--------------
 5min
(1 row)

标签: postgresql

解决方案


并发索引创建不应锁定表。

当然它锁定了桌子。如果有人在索引被索引时试图删除表,会发生什么?它只是将其锁定在与 INSERT、UPDATE 或 DELETE 不冲突的模式下。但它确实与其他操作冲突,包括 VACUUM 和(具有讽刺意味的是,也许)其他 CREATE INDEX CONCURRENTLY。它还需要一个更强大的锁,它会与所有内容发生冲突,但它只是暂时持有该锁。但是,如果该锁不是立即可用的,它可能会在等待它时超时。

test=> show lock_timeout;
 lock_timeout
--------------
 5min
(1 row)

test=> set lock_timeout to 99999999;
SET
test=> show lock_timeout;
 lock_timeout
--------------
 5min
(1 row)

正如连续代码缩进所暗示的那样,所有这些是否在一个会话中运行,没有中间语句?如果是这样,那么我认为您必须运行一些修改后的 PostgreSQL 版本,因为我认为社区 PostgreSQL 的任何版本都不会那样做。


推荐阅读