gpt4 book ai didi

database - 为什么 Postgres 从 9.4 开始对 ALTER TABLE ADD COLUMN 语句强制执行 ACCESS EXCLUSIVE 锁?

转载 作者:搜寻专家 更新时间:2023-10-30 19:50:23 26 4
gpt4 key购买 nike

我对 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 文档中说

An ACCESS EXCLUSIVE lock is held unless explicitly noted. When multiple subcommands are listed, the lock held will be the strictest one required from any subcommand.

而在 9.3 中没有这样的东西。

在实践中,当表流量很大时,9.4 似乎更有可能触发死锁——但不确定为什么会这样。理论上是事务隐式持有表上的 ROW EXCLUSIVE 锁,然后在语句执行时升级为 ACCESS EXCLUSIVE,但这同样只是一种理论。

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

最佳答案

我刚刚使用 PostgreSQL 9.2 进行了测试,它需要一个 ACCESS EXCLUSIVE 锁。

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

文档中的差异是由于 PostgreSQL commit e5550d5fec66aa74caad1f79b79826ec64898688这改进了文档,同时具有讽刺意味的是,降低了某些 ALTER TABLE 子命令所需的锁定级别。

我们一直在努力减少 PostgreSQL 中锁的数量和严重程度。

关于database - 为什么 Postgres 从 9.4 开始对 ALTER TABLE ADD COLUMN 语句强制执行 ACCESS EXCLUSIVE 锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43972656/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com