我对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
,但它又只是一个理论。
问题是:改变设计的是什么以及今天为高流量表添加列的正确方法是什么?
答案 0 :(得分:1)
我刚刚使用PostgreSQL 9.2测试过,它需要ACCESS EXCLUSIVE
锁定。
锁定只会持续很短的时间,但是如果有很多并发活动(特别是长时间操作),那么在ACCESS EXCLUSIVE
锁定请求后面堆积的事务可能会有明显的挂起。等待长时间的交易完成。
文档的不同之处在于PostgreSQL提交e5550d5fec66aa74caad1f79b79826ec64898688,它改进了文档,具有讽刺意味的是,减少了某些ALTER TABLE
子命令所需的锁定级别。
正在努力尽可能减少PostgreSQL中锁的数量和严重程度。