这是postgres的最新发行版代码(链接为here):
switch (cmd->subtype)
{
/*
* These subcommands rewrite the heap, so require full locks.
*/
case AT_AddColumn: /* may rewrite heap, in some cases and visible
* to SELECT */
case AT_SetTableSpace: /* must rewrite heap */
case AT_AlterColumnType: /* must rewrite heap */
case AT_AddOids: /* must rewrite heap */
cmd_lockmode = AccessExclusiveLock;
break;
从PostgreSQL 9.4开始,我们有了目录MVCC。我的问题是:为什么在执行alter table命令时必须采取最高的锁定级别?代码中的注释说:“这些子命令重写堆,因此需要完全锁定。”我不明白。
答案 0 :(得分:1)
据我所知,大多数ALTER TABLE
语句都需要一个ACCESS EXCLUSIVE
锁,因为并不是所有涉及目录的严格都是MVCC。
通常,该锁非常短,您不会注意到它。
某些变体必须重写整个表,因为它们会更改磁盘结构,例如:
数据类型更改为具有不同内部表示形式的类型
直到v11,如果将具有NOT NULL
值的DEFAULT
列添加到表中,我们必须重写表
我们正在努力减少锁定。