postgresql - Postgres 事务似乎无缘无故采用 AccessExclusiveLock

标签 postgresql transactions locking

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

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

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

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

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

我基于对官方文档的阅读 here - 所以我不会因为向任何人询问 RTFM 而生气 :)

谢谢,
贾尔佩什

最佳答案

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

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

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

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

关于postgresql - Postgres 事务似乎无缘无故采用 AccessExclusiveLock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19324637/

相关文章:

postgresql - 如何根据日期选择 postgres 表中的行并将其存储在新表中?

mysql - Rails - postgres 上的 gmaps4rails gem

postgresql - Postgres (Amazon RDS) 如何计算加权平均值

java - 使用ReentrantLock代替synchronized来提高性能

sql - 单行中有多个记录

java - 数据源、XADataSource 和 JTA

ruby-on-rails-3 - Rake 任务中的事务

java - 如何理解Java Thread中的wait和notify方法?

multithreading - 原始同步原语——安全吗?

javascript - Firebase 云存储 : how to "update all"/"delete some" docs in a collection?