Это всего лишь предположение, но я подозреваю, что нужно сделать комбинацию из того, что оба получат блокировку на всю таблицу, чтобы гарантировать постоянное соответствие схеме и re -выделить место для записей.
Разрешение прямого добавления столбца NOT NULL
поставит под угрозу любые существующие записи, если значение по умолчанию отсутствует. Да, мы знаем, что таблица пуста. И база данных может (в конце концов) знать, что таблица пуста в время выполнения ... но она не может знать, что таблица пуста во время компиляции плана выполнения, потому что строка может быть добавлена во время выполнения план определен.
Это означает, что базе данных потребуется сгенерировать наихудший план выполнения, включающий блокировку всей таблицы, для выполнения запроса транзакционно-безопасным способом. Кроме того, добавление (или удаление) столбца приводит к дополнительной работе с базой данных, поскольку ей необходимо перераспределить любые страницы и перестроить индексы, чтобы учесть измененный размер отдельных записей.
Соедините их вместе, и становится трудно просто откатить неудачный запрос, потому что у вас могут быть реальные страницы в разных состояниях. По какой-то причине разработчики решили не допустить этого.
Другие опции позволяют вам просто не выполнять запрос, если мешающая строка мешает и нарушает схему, потому что вы не изменяете размеры записей на страницах. Это может даже позволить вам избежать некоторых блокировок страниц и строк, а не полных блокировок таблиц.