经过大量谷歌搜索后,我想我会问这个问题。我有一段代码针对 postgres (9.2) 数据库执行以下操作:
- 开始交易
- 在表上删除索引(5 个索引)
- 向表中插入一百万行
- 重新创建索引
- 提交交易。
我对 postgres 的阅读告诉我,我应该能够做到这一点,并且仍然允许其他用户从表中进行选择(实际上什至使用现有的索引,因为它们还没有被删除),同时这个操作正在进行。
我实际发现的是表中的所有其他查询(它们是所有 选择查询)都被卡住了。查看 pg_locks 和 pg_stat_activity 表后,我发现我的事务在表上创建了一个 AccessExclusiveLock,阻止其他查询运行。此事务完成后,所有其他查询都可以正常执行。
所以,我的问题是 - 为什么创建索引/插入数据会在表上创建排他锁?它不应该使用侵入性较小的锁(例如 SHARE 锁)吗?
我基于对官方文档的阅读 here - 所以我不会因为向任何人询问 RTFM 而生气 :)
谢谢,
贾尔佩什
最佳答案
我也想要这个,但是你做不到。
在表上获取 AccessExclusive 锁的不是创建索引,也不是插入,而是删除索引。
该文档并未提供获取每种类型锁的每种情况的详尽列表——它仅提供说明性示例(但也许应该将此示例包含在其中)。
我相信代码的很多部分都假设在表上持有 AccessShare 锁时索引不会消失。因此删除索引需要与此冲突。
关于postgresql - Postgres 事务似乎无缘无故采用 AccessExclusiveLock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19324637/