почему postgres использует Access Exclusive Lock во многих командах alter table? - PullRequest
0 голосов
/ 25 октября 2018

Это последний код выпуска-версии 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?Комментарии в коде говорят, что «эти подкоманды перезаписывают кучу, поэтому требуют полной блокировки».Я не понимаю этого.

1 Ответ

0 голосов
/ 25 октября 2018

Насколько я знаю, большинство ALTER TABLE операторов требуют блокировки ACCESS EXCLUSIVE, потому что не все строго MVCC, когда речь идет о каталогах.

Обычно эта блокировка очень короткая, и вы не будетеобратите внимание.

Некоторые варианты должны переписать всю таблицу, потому что они изменяют структуру на диске, например:

  • тип данных изменяется на тип сдругое внутреннее представление

  • до версии v11, нам пришлось переписать таблицу, если в таблицу был добавлен столбец NOT NULL со значением DEFAULT

Продолжаются попытки уменьшить количество замков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...