Locks no MySQL

Ola pessoal,

Depois de falarmos sobre transações e níveis de isolamento, vamos fechar este assunto com os conceitos de bloqueio utilizados no MySQL.

O MySQL usa uma arquitetura multi-thread para gerenciar as conexões a todos os usuários, onde cada conexão tera uma thread como um controlador. O bloqueio adotado pelo MySQL impede a ocorrência de problemas com dados acessados de forma simultânea por vários clientes, onde uma conexão não ira interferir na outra.

Quando varios clientes tentam manipular o mesmo dado, o MySQL atribui um bloqueio a um cliente com base na thread, onde enquanto este bloqueio não seja liberado, os outros clientes não conseguem manipular o mesmo dado, ou seja, cada um tem a sua vez.

O efeito do mecanismo de bloqueio é serializar o acesso aos dados, onde clientes que tentam efetuar operações conflitantes deverão aguardar a sua vez.

Mas nem todo o tipo de acesso gera um conflito, um exemplo:

– Caso a conexão “A” e “B” precisem ler algum dado, isso não irá gerar um conflito e os dois poderão ler ao mesmo tempo.

– Caso a conexão “A” inicie uma leitura e a “B” precise gravar um novo dado, a conexão “B” deverá aguardar a leitura da conexão “A” ser finalizada, para assim conseguir gravar o novo dado.

– Agora se a conexão “A” iniciar uma gravação de dados, todas as conexões abaixo deverão aguardar a gravação ser concluida, seja ela uma conexão de leitura ou gravação.

Uma operação de leitura deve bloquear uma operação de gravação, porém uma operação de gravação deve bloquear as demais seja leitura ou gravação até a sua finalização

Tipos de bloqueio:

— Implicito

Os bloqueios sobre os dados podem ser de forma implícita, explícita ou com advisory locks.

Caso você trabalhe com o autocommit habilitado no MySQL, o servidor adquiri bloqueios implicitamente para cada comando, e cancela o mesmo após a conclusão.
Continue lendo