为什么postgres在许多alter table命令中都使用Access Exclusive锁?

时间:2018-10-25 06:39:31

标签: postgresql alter-table

这是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命令时必须采取最高的锁定级别?代码中的注释说:“这些子命令重写堆,因此需要完全锁定。”我不明白。

1 个答案:

答案 0 :(得分:1)

据我所知,大多数ALTER TABLE语句都需要一个ACCESS EXCLUSIVE锁,因为并不是所有涉及目录的严格都是MVCC。

通常,该锁非常短,您不会注意到它。

某些变体必须重写整个表,因为它们会更改磁盘结构,例如:

  • 数据类型更改为具有不同内部表示形式的类型

  • 直到v11,如果将具有NOT NULL值的DEFAULT列添加到表中,我们必须重写表

我们正在努力减少锁定。