← MySQL: desenvolvimento e operação segura
10 / 12 · 70 MIN

Metadata locks e aceitação da release

Diagnostica uma alteração de schema bloqueada e define evidência de conclusão sem confundir online com ausência de espera.

Uma leitura simples pode atrasar o schema

A ausência de FOR UPDATE não significa ausência de qualquer lock. Numa transação aberta, o SELECT simples usado no laboratório manteve um metadata lock sobre items. A outra ligação tentou alterar a estrutura e ficou pendente. Não houve necessidade de uma atualização de saldo para reproduzir a espera. O objetivo do lock é proteger o uso do objeto durante a transação, não reservar um valor de negócio como numa leitura com lock de linha. Para um incidente de release, identifica a transação aberta e a sua finalidade; tratar todas as esperas como conflito entre escritores pode esconder o verdadeiro titular que impede a alteração.

Observar metadata e identidade

O guião consultou performance_schema.metadata_locks e associou OWNER_THREAD_ID a performance_schema.threads para obter PROCESSLIST_ID. Confirmou um lock concedido com duração TRANSACTION na ligação titular e um pedido pendente na ligação do ALTER. Isto liga a observação aos clientes que o próprio ensaio criou. Não derives identificadores de ligação de campos que representam locks ou endereços internos. Numa ocorrência real, acrescenta responsável, finalidade e impacto da transação antes de intervir. O observador do laboratório era root local; portanto, a experiência não demonstra que uma conta operacional tenha esses privilégios nem valida o processo de autorização da equipa.

Timeout de metadata e trabalho já confirmado

A ligação do ALTER tinha lock_wait_timeout definido para um segundo e recebeu 1205 enquanto outra transação mantinha metadata. A coluna pretendida não foi acrescentada. Contudo, a nota inserida antes do ALTER ficou confirmada, porque esse comando tinha encerrado implicitamente a transação anterior. Esta observação combina duas fronteiras: espera pelo schema e commit do trabalho que o precedia. Não uses apenas o código 1205 para escolher uma política de recuperação, pois o mesmo número apareceu no laboratório de contenção InnoDB com outro comando e outro âmbito. Regista a instrução, a variável relevante e o estado confirmado antes de decidir repetir ou reconciliar.

LOCK=NONE e a janela de mudança

O segundo percurso acrescentou um índice com ALGORITHM=INPLACE e LOCK=NONE. Ainda assim, o pedido ficou pendente enquanto a leitura da outra transação mantinha metadata. Depois do rollback controlado dessa ligação, o índice foi criado. A opção não é uma promessa de latência zero, ausência de metadata locks ou custo desprezável. Este ensaio tem apenas duas linhas e não mede duração numa tabela de produção, impacto em I/O ou atraso de réplica. Usa o resultado para formular perguntas de aceitação: transações antigas foram identificadas, o prazo de espera foi definido e existe um responsável pela decisão se a mudança exceder a janela?

Falha de índice e significado de atomic DDL

As duas linhas tinham amount=100. Tentar acrescentar um índice UNIQUE nessa coluna devolveu 1062; as linhas originais permaneceram e o índice pretendido não existia. O resultado demonstra uma falha SQL controlada com estado observado depois da operação. A documentação descreve garantias de atomic DDL, mas isso não transforma DDL em comandos reversíveis pela transação do utilizador. Também não permite afirmar que este guião ensaiou crash recovery: o servidor não foi interrompido durante a alteração. Na revisão de release, mantém separadas a integridade da operação DDL, a confirmação de trabalho anterior e a recuperação perante falhas de infraestrutura que exigem testes próprios.

Definir aceitação com evidência delimitada

Um handover útil identifica o schema esperado, o resultado dos dados, os marcadores da migração e os testes dos consumidores. Os catorze grupos locais ajudam a construir esse raciocínio, mas não aprovam automaticamente uma framework de migração ou uma aplicação bancária. O ensaio usou um servidor nativo MySQL 9.7.2 descartável, três ligações próprias e dois comandos concorrentes, terminando os clientes e o servidor no fim. Não houve TCP, credenciais reais, pool, réplica, crash, benchmark ou oficina humana. Para o serviço concreto, ainda faltam uma janela representativa, critérios de rollback ou recuperação acordados, teste da aplicação e revisão do responsável técnico.

-- Connection A keeps a transaction open after a plain read.
START TRANSACTION;
SELECT * FROM items;
-- Connection B runs concurrently and may wait for metadata.
ALTER TABLE items ADD INDEX by_amount(amount), ALGORITHM=INPLACE, LOCK=NONE;
-- Connection A ends its transaction after the owned wait is observed.
ROLLBACK;
NA PRÁTICA

Uma transação que só fez SELECT manteve um metadata lock. ALTER TABLE com LOCK=NONE esperou até essa transação terminar.

Armadilhas comuns

Interpretar LOCK=NONE como espera zero; usar só locks de linhas no diagnóstico; declarar crash recovery a partir de uma falha SQL controlada.

Tópicos relacionados: Atomicidade e alterações de schema · Metadata locks e aceitação da release

Leva esta ideia contigo

Uma release precisa de observar a espera, confirmar o resultado e provar o contrato da aplicação dentro do âmbito realmente ensaiado.

Criar conta

Referência: Transaction duration of metadata locks · MySQL 9.7 LTS with InnoDB reference semantics

MySQL® é uma marca registada da Oracle e/ou das suas afiliadas. A dr.pt é uma plataforma de preparação independente e não está afiliada, associada, patrocinada, autorizada nem aprovada por Oracle. Os conteúdos e as perguntas são originais, não são perguntas oficiais de exame, e concluir os nossos testes não atribui nem garante qualquer certificação. Os nomes são usados apenas para identificar o tema. Todas as outras marcas pertencem aos respetivos titulares.