Postgres 事务似乎无缘无故地采用 AccessExclusiveLock

Jal*_*esh 5 postgresql locking transactions

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

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

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

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

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

我是基于我对这里的官方文档的阅读- 所以我不会因为任何人向 RTFM 提出要求而生气:)

谢谢,
贾尔佩什

jja*_*nes 4

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

在表上获取 AccessExclusive 锁的不是创建索引,也不是插入,而是删除索引。

该文档并未提供获取每种类型锁的每种情况的详尽列表——它仅提供说明性示例(但也许应该包含此示例)。

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