为什么Postgres从9.4开始对ALTER TABLE ADD COLUMN语句开始强制执行A​​CCESS EXCLUSIVE锁?

时间:2017-05-15 06:20:05

标签: database postgresql

我对postgres中ALTER TABLE ADD COLUMN的原始理解是,如果你只是添加一个简单的新列(即没有默认值,没有索引,没有非空验证等),那么就没有锁定。

然而,从9.4开始,这似乎不再是真的:

https://www.postgresql.org/docs/9.3/static/sql-altertable.html

https://www.postgresql.org/docs/9.4/static/sql-altertable.html

在9.4文档中说

  

除非明确说明,否则将保持ACCESS EXCLUSIVE锁定。什么时候   列出了多个子命令,锁定将是最严格的   任何子命令都需要一个。

虽然在9.3中没有这样的事情。

实际上,当桌子流量很大时,9.4似乎更有可能触发死锁 - 但不确定为什么会出现这种情况。理论是事务隐含地在表上持有ROW EXCLUSIVE锁,然后当语句执行时它会升级到ACCESS EXCLUSIVE,但它又只是一个理论。

问题是:改变设计的是什么以及今天为高流量表添加列的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

我刚刚使用PostgreSQL 9.2测试过,它需要ACCESS EXCLUSIVE锁定。

锁定只会持续很短的时间,但是如果有很多并发活动(特别是长时间操作),那么在ACCESS EXCLUSIVE锁定请求后面堆积的事务可能会有明显的挂起。等待长时间的交易完成。

文档的不同之处在于PostgreSQL提交e5550d5fec66aa74caad1f79b79826ec64898688,它改进了文档,具有讽刺意味的是,减少了某些ALTER TABLE子命令所需的锁定级别。

正在努力尽可能减少PostgreSQL中锁的数量和严重程度。