【问题标题】:why postgres takes an Access Exclusive Lock in many alter table commands?为什么 postgres 在许多 alter table 命令中采用访问排他锁?
【发布时间】:2018-10-25 06:39:31
【问题描述】:

这是postgres最新的release-version代码(链接是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。我的问题是:为什么在执行更改表命令时必须采用最高锁定级别?代码中的 cmets 说“这些子命令重写了堆,因此需要全锁”。没看懂。

【问题讨论】:

    标签: postgresql alter-table


    【解决方案1】:

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

    通常那个锁很短,你不会注意到它。

    有些变种不得不重写整个表,因为它们改变了磁盘结构,例如:

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

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

    正在努力减少锁定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-15
      • 2014-05-11
      • 1970-01-01
      • 1970-01-01
      • 2021-08-01
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多