Se você trabalha com MySQL há algum tempo, provavelmente já ouviu os termos “bloqueio em nível de tabela” e “bloqueio em nível de linha”. Esses termos se referem à granularidade de bloqueio no MySQL - neste blog, explicaremos o que eles significam e para que podem ser usados.
O que é a granularidade de bloqueio no MySQL?
Cada mecanismo de armazenamento MySQL suporta diferentes níveis de granularidade para seus bloqueios. O MySQL tem três níveis de bloqueio:bloqueio em nível de linha, bloqueio em nível de página e bloqueio em nível de tabela. Cada mecanismo de armazenamento MySQL implementa o bloqueio de maneira diferente, oferecendo algumas vantagens e desvantagens distintas. Veremos primeiro o que é a granularidade de bloqueio e, em seguida, veremos como tudo funciona em diferentes mecanismos de armazenamento.
De um modo geral, os bloqueios no MySQL se enquadram em uma dessas categorias. As fechaduras podem ser:
-
Nível de página - esses tipos de granularidades de bloqueio estavam disponíveis em mecanismos mais antigos do MySQL, especificamente BDB, que é agora obsoleto a partir do MySQL 5.1. Resumindo, o BDB era um mecanismo de armazenamento incluído nas versões mais antigas do MySQL e era um mecanismo de armazenamento transacional que realizava bloqueios em nível de página. Como esses tipos de granularidades de bloqueio não são mais usados, não os aprofundaremos aqui, mas, em geral, esses bloqueios são limitados aos dados e índices que residem em uma página específica. Se você quiser saber mais sobre o BDB, a página no MariaDB deve fornecer mais algumas informações.
-
Nível de tabela - O MySQL usa bloqueio de nível de tabela para todos os mecanismos de armazenamento, exceto InnoDB.
-
Nível de linha - o bloqueio em nível de linha é usado pelo InnoDB.
As vantagens e desvantagens do bloqueio em nível de tabela
O MySQL usa bloqueio em nível de tabela para todos os mecanismos de armazenamento, exceto InnoDB, o que significa que o bloqueio em nível de tabela é usado para tabelas executando os mecanismos de armazenamento MyISAM, MEMORY e MERGE, permitindo que apenas uma sessão atualize tabelas por vez . Os bloqueios em nível de tabela têm algumas vantagens distintas sobre os bloqueios em nível de linha (por exemplo, o bloqueio em nível de tabela em geral requer um pouco menos de memória do que o bloqueio em nível de linha porque o bloqueio em nível de linha requer alguma memória por linha (ou grupo) das linhas que estão bloqueados e geralmente é rápido porque apenas um bloqueio está envolvido. Bloqueios de gravação de tabela são colocados em uma tabela se não houver bloqueios nela - se houver bloqueios pré-existentes na tabela em questão, as solicitações de bloqueio de tabela são colocadas a fila de solicitações de leitura. Vale a pena mencionar que o bloqueio em nível de tabela também tem algumas desvantagens distintas - por exemplo, pode não ser muito adequado para aplicativos que exigem muitas transações que vão e voltam (por exemplo, , um aplicativo de banco on-line) porque apenas uma sessão pode gravar em uma tabela a qualquer momento e algumas das tabelas que suportam o bloqueio em nível de tabela (como MyISAM) não suportam o modelo ACID.
Aqui está um exemplo:imagine um aplicativo bancário que usa duas tabelas em um banco de dados - digamos que essas tabelas sejam chamadas de “checagem” e “poupança”. Você precisa mover $ 100 da conta corrente de uma pessoa para sua conta poupança. Logicamente, você executaria as seguintes etapas:
-
Certifique-se de que o saldo da conta seja superior a US$ 100.
-
Subtraia $100 da conta corrente.
-
Adicione $100 à conta poupança.
Para realizar essas ações, você precisaria de algumas consultas, por exemplo:
SELECT balance FROM checking WHERE account_id = 123;
UPDATE checking SET balance = balance - 100 WHERE account_id = 123;
UPDATE savings SET balance = balance + 100 WHERE account_id = 123;
Essas consultas podem parecer simples, mas se você usa MyISAM (nós usamos MyISAM como exemplo, pois é um dos principais mecanismos de armazenamento que suportam bloqueios em nível de tabela), você deve estar familiarizado com o fato de que o mecanismo também não suporta ACID, o que significa que se o servidor de banco de dados travar durante a execução de qualquer uma dessas consultas, você está sem sorte:as pessoas podem acabar com dinheiro em ambas as contas ou em nenhuma delas. O único mecanismo que suporta transações baseadas em ACID no MySQL é o InnoDB, portanto, se você precisar de muitas transações confiáveis, pode valer a pena dar uma olhada. O InnoDB também suporta bloqueio em nível de linha - é isso que veremos agora.
As vantagens e desvantagens do bloqueio em nível de linha
O MySQL usa bloqueio em nível de linha para tabelas InnoDB para dar suporte ao acesso de gravação simultâneo por várias sessões. Algumas das vantagens de usar o bloqueio em nível de linha incluem a capacidade de bloquear uma única linha por longos períodos de tempo e menos conflitos de bloqueio quando muitos encadeamentos acessam linhas diferentes. No entanto, o bloqueio em nível de linha também tem desvantagens:uma delas é que o bloqueio em nível de linha geralmente ocupa mais memória do que o bloqueio em nível de página ou em nível de tabela, também é geralmente mais lento que os bloqueios em nível de página ou tabela porque o mecanismo deve adquirir mais fechaduras. O InnoDB é um dos mecanismos que suporta um mecanismo de bloqueio em nível de linha:também é compatível com ACID, o que significa que é um bom ajuste para aplicativos baseados em transações (consulte o exemplo acima). Agora veremos como a granularidade de bloqueio funciona em um dos mecanismos de armazenamento do MySQL.
Como funciona a granularidade de bloqueio no InnoDB?
O InnoDB é amplamente conhecido por oferecer suporte ao bloqueio em nível de linha, mas também vale a pena notar que o mecanismo oferece suporte a vários tipos de bloqueio, o que significa que você pode usar bloqueios em nível de linha e em nível de tabela. O InnoDB executa o bloqueio em nível de linha definindo bloqueios compartilhados ou exclusivos nos registros de índice que encontra quando pesquisa ou varre um índice de tabela. Um bloqueio compartilhado é um bloqueio que permite que a transação que mantém o bloqueio leia a linha em questão; um bloqueio exclusivo, por outro lado, permite que a transação que mantém o bloqueio atualize ou exclua uma linha.
O InnoDB também possui outros tipos de bloqueios - alguns deles incluem bloqueios compartilhados e exclusivos, bloqueios de intenção, bloqueios de registro, bloqueios de intervalo, bloqueios de próxima chave e bloqueios de próxima intenção. Os bloqueios de intenção, por exemplo, também podem ser compartilhados ou exclusivos - esses bloqueios geralmente indicam que uma transação pretende definir um determinado tipo de bloqueio (um bloqueio compartilhado ou um bloqueio exclusivo) em linhas individuais de uma tabela, um bloqueio de registro é um bloquear em um registro de índice etc.
Em geral, a granularidade de bloqueio do InnoDB difere da granularidade de bloqueio presente em outros mecanismos de armazenamento MySQL (por exemplo, MyISAM) porque quando o bloqueio em nível de tabela está em uso, apenas uma sessão para atualizar certas tabelas em um o tempo pode correr. Quando o bloqueio em nível de linha está em uso, o MySQL suporta acesso de gravação simultâneo em várias sessões, tornando os mecanismos de armazenamento de bloqueio em nível de linha (InnoDB) uma escolha adequada para aplicativos de missão crítica.
Bloquear granularidade e impasses
A granularidade de bloqueio e os níveis de bloqueio no MySQL podem ser ótimos, mas também podem causar problemas. Um dos problemas mais frequentes causados pela granularidade de bloqueio são os deadlocks - um deadlock ocorre quando diferentes transações do MySQL não conseguem prosseguir porque cada uma delas mantém um bloqueio que a outra precisa. Felizmente, ao usar o mecanismo de armazenamento InnoDB, a detecção de deadlock é habilitada por padrão - quando um deadlock é detectado, o InnoDB reverte automaticamente uma transação. Se você encontrar impasses ao lidar com granularidade de bloqueio no MySQL, não se preocupe - considere simplesmente reiniciar sua transação. Para monitorar proativamente seu banco de dados, você também deve considerar a utilização dos recursos fornecidos pelo ClusterControl.
Como o ClusterControl pode ajudar você?
Aqui estão algumas das coisas que o ClusterControl desenvolvido pela Variousnines pode ajudá-lo:
-
A proteção de todos os seus dados comerciais
-
Se seus dados estiverem corrompidos (isso pode ser causado por não usar um mecanismo de armazenamento compatível com ACID ou também por outros fatores descritos acima), a ferramenta pode executar um processo automático que realmente verifica se você pode recuperar seus dados.
-
A ferramenta pode informar quais bancos de dados não têm backup ou mostrar o status de seus backups (se eles foram bem sucedidos ou eles falharam)
-
-
A automação de suas operações de banco de dados
-
O ClusterControl pode ajudá-lo a garantir que seus administradores de sistema, desenvolvedores e DBAs gerenciem clusters de banco de dados inteiros com eficiência com riscos mínimos usando Melhores Práticas
-
-
Gerenciando com eficiência sua infraestrutura de banco de dados em geral
-
A mudança atual nas tecnologias combinadas com soluções de infraestrutura sofisticadas requer ferramentas e conhecimentos avançados para alcançar alta disponibilidade e desempenho ideal para seus aplicativos essenciais aos negócios. O ClusterControl também pode ajudá-lo com a implantação, monitoramento, gerenciamento e dimensionamento das tecnologias de banco de dados de código aberto mais populares, incluindo MySQL, MariaDB, MongoDB, PostgreSQL, TimeScaleDB e o resto.
-
Para saber mais sobre como o ClusterControl pode ajudar a agilizar suas operações de negócios, fique de olho no blog do banco de dados do Manynines.
Resumo
Diferentes mecanismos de armazenamento MySQL têm diferentes tipos de granularidades de bloqueio disponíveis. Antes de decidir sobre o mecanismo de armazenamento que você deve usar, certifique-se de saber o máximo possível de informações sobre o mecanismo de armazenamento em questão (por exemplo, como já observado, o MyISAM deve ser evitado ao lidar com dados de missão crítica porque não é compatível com ACID), entenda todas as implicações de desempenho relacionadas, incluindo granularidades de bloqueio, impasses e o resto, e escolha com sabedoria.