繁体   English   中英

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

[英]why postgres takes an Access Exclusive Lock in many alter table commands?

这是postgres的最新发行版代码(链接在此处 ):

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

据我所知,大多数ALTER TABLE语句都需要ACCESS EXCLUSIVE锁,因为与目录有关的并非所有内容都严格是MVCC。

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

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

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

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

正在进行减少锁的努力。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM