Quando várias seleções são usadas em um UNION/UNION ALL
, os bloqueios de tabela para cada SELECT
instrução individual são tratados individualmente ou todos os bloqueios de tabela são mantidos até que todas as SELECT
instruções sejam concluídas?
Por exemplo, 100 instruções de seleção individuais são concatenadas por meio de UNION/UNION ALL
. (Supondo que eles sejam resolvidos sequencialmente) Se a primeira SELECT
transação for concluída e outra transação em uma sessão diferente tentar acessar os mesmos dados, os dados ainda estarão bloqueados pelo UNION
?
Estou apenas tentando entender como UNIONs
se comportar com as tabelas físicas enquanto elas ainda estão em execução.
Para a consulta que levou a isso, existem 7 declarações diferentes no UNION
(Not UNION ALL
). Com essa pergunta em particular, eu estava apenas querendo entender a arquitetura de back-end de como UNION/UNION ALL
funcionava. A consulta que gerou essa pergunta causa muito bloqueio, mas é executada apenas por cerca de um minuto, então eu estava tentando entender se era a consulta inteira que causava isso ou apenas algumas das partes individuais.
Eu adicionei uma pergunta de acompanhamento aqui: Estrutura de bloqueio de tabela/linha de back-end usando consultas CTE
Todos os
select .. union .. select ..
bits contam como uma única instrução. Não consigo encontrar um artigo na documentação para justificar isso, mas posso oferecer evidências de apoio.Primeiro, o ponto e vírgula é o terminador de instrução Transact-SQL . Há apenas um lugar em sua consulta que será aceito e é no final do último
SELECT
. Em segundo lugar, o plano de execução consiste em uma única árvore, indicativa de uma única instrução. Em contraste, duas consultas enviadas como um único lote causariam duas árvores de execução desarticuladas.Se houver uma transação explícita em vigor,
select..union
ela se tornará parte dela e os bloqueios serão mantidos até queCOMMIT
ouROLLBACK
. Se você tiver uma transação implícita, ou seja, autocommit, notSET IMPLICIT_TRANSACTIONS
, ela abrange todas as seleções. Os bloqueios serão mantidos pelo tempo que forem mantidos sem oUNION
, regido pelo nível de isolamento, opções de consulta (TABLOCKX
etc.), escalação de bloqueio, sinalizadores de rastreamento .. e todas as outras coisas que afetam isso.