经过大量的谷歌搜索,我想我会问这个问题。我有一段代码对 postgres (9.2) 数据库执行以下操作:
- 开始交易
- 在表上删除索引(5 个索引)
- 在表中插入一百万行
- 重新创建索引
- 提交事务。
我对 postgres 的阅读告诉我,当此操作正在进行时,我应该能够做到这一点,并且仍然允许其他用户从表中进行选择(实际上甚至使用现有索引,因为它们还没有被删除)。
我实际上发现的是表上的所有其他查询(它们都是选择查询)都被卡住了。在查看 pg_locks 和 pg_stat_activity 表时,我发现我的事务在表上创建了一个 AccessExclusiveLock,从而阻止了其他查询的运行。一旦此事务完成,所有其他查询都会正常执行。
所以,我的问题是 - 为什么创建索引/插入数据会在表上创建排他锁?不应该使用侵入性较小的锁(例如共享锁)吗?
我是根据我阅读这里的官方文档来做这个的——所以我不会因为任何人向 RTFM 提出要求而生气 :)
谢谢,
贾尔佩什