当前位置: 首页 > 知识库问答 >
问题:

Postgres交易似乎无缘无故地占用了AccessExclusiveLock

商嘉木
2023-03-14

经过大量的谷歌搜索,我想我会问这个问题。我有一段代码可以针对 postgres (9.2) 数据库执行以下操作:

  1. 开始交易
  2. 删除表上的索引(5个索引)
  3. 在表中插入一百万行
  4. 重新创建索引
  5. 提交事务。

我对 postgres 的阅读告诉我,在此操作正在进行时,我应该能够做到这一点并且仍然允许其他用户从表中进行选择(实际上甚至使用现有索引,因为它们尚未删除)。

我实际上发现的是表上的所有其他查询(它们都是选择查询)都卡住了。在查看pg_locks和pg_stat_activity表时,我发现我的事务在表上创建了一个 AccessExclusiveLock,阻止其他查询运行。此事务完成后,所有其他查询都可以正常执行。

所以,我的问题是 - 为什么创建索引/插入数据会在表上创建独占锁?它不应该使用侵入性较小的锁(例如 SHARE 锁)吗?

我是根据我对官方文档的阅读来做这个的——所以我不会被任何人的RTFM邀请:)

谢谢,
Jalpesh

共有2个答案

益富
2023-03-14

我想您希望能够在大容量插入期间查询表,并通过在插入期间不维护索引来加快大容量插入。

我认为您可以通过以下步骤实现这一点:

begin;    

maxid = select max(id) from table_name;    

create index table_name_id_tmp_idx where id<=maxid;    

drop index table_name_id_idx;    

commit;    

begin;    

do_bulk_insert();    

create index table_name_id_idx on table_name(id);    

drop index table_name_id_tmp_idx;    

commit;    

这不可能适用于每个索引,因为您需要这个<code>where</code>谓词来表示部分索引,它将对现有行返回<code>true</code>,对插入的行返回<code>false</code>。但序列列、时间戳等也可以。

王兴腾
2023-03-14

我也想要这个,但你做不到。

不是创建索引或插入在表上采用 AccessExclusive 锁,而是删除索引在这样做。

留档并没有提供获得每种锁类型的每种情况的详尽列表——它只提供了说明性示例(但也许这个示例应该包含在其中)。

我相信代码的许多部分都假定在表上的AccessShare锁被保持时索引不会消失。因此,删除索引需要与之冲突。

 类似资料:
  • 问题内容: 在Eclipse中调试时,经常会发生调试器崩溃,并显示错误消息“找不到源”(在其下方是带有文本“编辑源查找路径”的按钮)。我以前曾在网上搜索该问题的解释/解决方案,但对我没有任何帮助。 但是,我现在已经弄清楚了我的情况:在逐行浏览代码,然后跳出正在运行的代码块时,会发生错误。我不知道该术语,但是我猜想许多应用程序可能会在某个时刻进入“待机模式”,而当前该代码均未运行。一个示例是等待鼠标

  • 我有一个bean生产者和一个bean消费者,在一条路由中使用。生产者是通过一个线程产生的,并监听hazelcast队列上的数据(它可能是其他任何东西,甚至是本地随机生成的数据)。 数据被发送到sedaendpoint,以确保并发性。使用者获取数据并将其转发到另一个hazelcast队列。但也可能是其他任何东西。 然后在300秒内静止处理并停止。 下面是一些代码: 制片人: 谢了!

  • 我是JPA新手。我正在开发一个使用JPA(Hibernate实现)和Spring的应用程序。我在persistence.xml中声明了一个持久性单元,并在Spring配置文件中声明了有关EntityManagerFactory的配置。类似于这样: 然后我有一些DAO,我在其中注入实体管理器与@PersistenceContext注释: 最后,我有一些注入DAO的服务(通过@Autowired Sp

  • 我不知所措。 我有一个数据类'Order',它有一个字段。当我试图在接受的方法中使用这个时,我会得到一个编译器错误,其内容如下: 我使用的是Java11、Spring JPA和PostgreSQL。 我从未在Java中见过这样的编译器错误(经过多年的编程),我不知所措。

  • 问题内容: 我的PHP版本是5.1.6,请按照以下说明安装Json: 现在,我检查是否启用了Json,但无法运行json_encode: 检查1: 结果1: 检查2: 结果2: 但是运行时: 这是运行链接: 检查Json:http : //69.64.69.43/fre/json.php php_info():http://69.64.69.43/fre/info.php 我当时确实在看并阅读了许

  • 第一次在Windows 7x64上启动IntelliJ IDEA Community Edition 14.0.2时,我在试图导入示例libGDX gradle配置时收到以下错误: IntelliJ14提供的javaHome似乎无效 IDE正在中查找java运行时,但是这些文件存在于这个目录之外的子目录中:。 我的解决方案是将的内容复制到上一级,这解决了问题--但感觉不是正确的做法。 这被记录为一