Estou usando o Red Gate SQL Compare para criar um script de lançamento com base nas diferenças entre o SVN e um banco de dados. Isso resulta em um script contendo várias alterações de tabela e procedimento e funciona bem. No entanto, uma coisa me intriga, é usar o nível de isolamento de transação serializável.
Eu sei o que isso faz com dml-statements, mas não tenho certeza do que isso significa para ddl. Alguém pode me esclarecer, talvez com um exemplo?
De um modo geral, não muito.
DDL abrange uma grande variedade de operações (muitas das quais têm seus próprios comportamentos especiais), mas a maioria das DDL terá um
Sch-M
bloqueio de modificação de esquema ( ) no objeto subjacente, seja durante o comando ou em um estágio crítico (por exemplo, em o fim da maioria das construções de índice online). Este é o tipo de bloqueio mais restritivo, impedindo qualquer tipo de acesso concorrente, em qualquer nível de isolamento.Mesmo onde
Sch-M
não é levado, o motor tem o cuidado de dar as travas certas nos momentos adequados para garantir que o resultado final seja correto . Por exemplo, não é possível construir um índice que não reflita exatamente os dados subjacentes.Todos os itens acima se aplicam independentemente de qualquer nível de isolamento de sessão especificado pelo usuário.
No que diz respeito às alterações nos metadados (ou seja, as estruturas do sistema subjacentes a exibições como ), enquanto o SQL Server garante alterações corretas automaticamente, o acesso do usuário é totalmente suportado e garantido para ser honrado no nível de isolamento
sys.tables
de bloqueio padrão .READ COMMITTED
Citando de Metadata Access, Isolation Levels e Lock Hints (ênfase adicionada):
Da mesma página:
Apesar de não ser garantido ou suportado, pode ser importante acessar metadados (por exemplo, exibições de catálogo, DMVs)
READ UNCOMMITTED
isoladamente para evitar problemas de bloqueio. A maioria das ferramentas e scripts de diagnóstico faz uso intenso deREAD UNCOMMITTED
isolamento (geralmente usando aNOLOCK
dica sinônima, mas com nome enganoso). Para obter um exemplo, consulte Consultas de diagnóstico de Glenn Berry .Como um exemplo de
READ UNCOMMITTED
acesso não honrado, consulte As funções de metadados devem seguir a mesma semântica de isolamento que as consultas de metadados em Conectar e Maus hábitos: usando (determinadas) funções "auxiliares" de metadados por Aaron Bertrand.Acessar metadados em um isolamento maior do que a leitura confirmada não é honrado - as informações serão lidas com
READ COMMITTED
semântica de isolamento.Se eu tivesse que adivinhar, diria que a ferramenta de comparação na pergunta define o isolamento
SERIALIZABLE
para cobrir qualquer DML no script gerado.Acredito que isso significará a mesma coisa para DDL e para DML. O artigo do msdn sobre o assunto, na verdade, fornece uma ideia bastante clara na
SERIALIZABLE
seção:Basicamente, enquanto sua transação estiver em execução, nenhum DDL poderá ser executado em nenhum dos objetos aos quais você faz referência direta ou indiretamente.