KB3168793 - CORREÇÃO: Não é possível criar ou excluir uma tabela ou índice quando outra transação DDL está sendo executada no mesmo banco de dados no SQL Server 2016

Aplica-se A
SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use)

Sintomas

Quando efetua operações DDL, tais como criar tabelas de índices ou truncamentos no SQL Server 2016, as operações poderão ser bloqueadas se existir outra transação DDL em execução na mesma base de dados.

Resolução

O problema foi corrigido na seguinte atualização cumulativa do SQL Server:

Recomendação: Instale a atualização cumulativa mais recente para o SQL Server

Cada nova atualização cumulativa para SQL Server contém todos os hotfixes e todas as correções de segurança que foram incluídas com a atualização cumulativa anterior. Recomendamos que transfira e instale as atualizações cumulativas mais recentes para SQL Server:

      

Mais Informações

Quando uma DDL cria ou elimina uma tabela ou um índice, precisa de inserir ou eliminar o ID do conjunto de linhas da tabela ou índice dos conjuntos de sysrowsets, para os quais precisa de manter um bloqueio de linha de nível X na entrada. Quando isso é feito dentro de uma transação, o bloqueio X será mantido durante a transação.

Quando o Tuple Mover descobre buffers de exclusão liberáveis, ele precisa iterar sobre sysrowsets para descobrir tabelas ou índices existentes. Para ler cada linha de sysrowsets, ele precisa manter um bloqueio S de nível de linha na entrada que lê atualmente. O processo de descoberta é interrompido quando o Tuple Mover encontra o primeiro conjunto de linhas em que pode trabalhar. Neste ponto, o Tuple Mover fará o trabalho real de liberar o buffer de exclusão, mas para se certificar de que o conjunto de linhas descoberto ainda é válido, ele manterá um bloqueio SCH-S em todos os conjuntos de linhas avaliados durante o processo de descoberta até concluir seu trabalho.

Sysrowsets é ordenado pelo id do conjunto de linhas, portanto, pode acontecer que o Tuple Mover tenha verificado vários conjuntos de linhas existentes nos quais ele não tem ação a fazer, mas ainda manterá o bloqueio SCH-S e chegará a uma entrada em sysrowsets para a qual não pode adquirir o bloqueio S de nível de linha, porque está sendo alterado por uma transação de longa duração que mantém um bloqueio X na linha. Neste ponto, as DDLs que envolvem a alteração do id do conjunto de linhas são bloqueadas atrás dos bloqueios SCH-S do Tuple Mover.

Estado

A Microsoft confirmou que se trata de um problema nos produtos Microsoft listados na secção "Aplica-se a".

Referências

Saiba mais sobre a terminologia que a Microsoft utiliza para descrever as atualizações de software.