postgresql - 并发创建唯一索引时的 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)
解决方案
并发索引创建不应锁定表。
当然它锁定了桌子。如果有人在索引被索引时试图删除表,会发生什么?它只是将其锁定在与 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 的任何版本都不会那样做。
推荐阅读
- z3 - z3: Horn clauses / Fixedpoints over inductive datatypes
- c++ - 将指针传递给 C++ 中的方法导致奇怪的输出
- assembly - How to compare negative numbers to positive numbers in MIPs assembly
- r - 使用 pheatmap 按行注释对数据进行排序?
- wordpress - 将 OAuth2 或 JWT 用于带有 Wordpress 后端(REST API)的移动应用程序
- c++ - Libvirt virDomainGetInfo() results in segmentation fault
- javascript - React: How to clear text in an element?
- google-cloud-platform - 如何访问保存到我的 google drive api 项目的文件
- sql - 从 ODI 表达式中的字符串中提取第二个单词
- javascript - 如何将 toTitleCase 函数转换为“本机”JavaScript 字符串方法?