minhas informações de contato
Correspondência[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Índice
1. Breve descrição dos bloqueios de banco de dados
2. Breve descrição do bloqueio de lacuna
3. Como os bloqueios em nível de linha são implementados no InnoDB
4. Em que circunstâncias ocorrerá um deadlock no banco de dados?
5. Descreva resumidamente a solução para o impasse do banco de dados
Os bloqueios são um recurso importante que distingue os sistemas de banco de dados dos sistemas de arquivos. O mecanismo de bloqueio é usado para gerenciar o acesso simultâneo a recursos compartilhados. Vamos tomar o mecanismo InnoDB do banco de dados MySQL como exemplo para apresentar brevemente as características dos bloqueios.
Se uma transação T1 obteve o bloqueio compartilhado da linha r, então outra transação T2 pode obter imediatamente o bloqueio compartilhado da linha r, porque a leitura não altera os dados da linha r. Esta situação é chamada de compatibilidade de bloqueio.Mas se outra transação T3 quiser obter o bloqueio exclusivo na linha r, ela deverá esperar que as transações T1 e T2 liberem o bloqueio compartilhado na linha r. Esta situação é chamada.bloqueio incompatível . A figura a seguir mostra a compatibilidade de bloqueios compartilhados e bloqueios exclusivos. Pode-se verificar que o bloqueio X é incompatível com qualquer bloqueio, enquanto o bloqueio S é compatível apenas com o bloqueio S. É importante observar que tanto o bloqueio S quanto o bloqueio X são bloqueios de linha, e compatibilidade refere-se à compatibilidade de bloqueios no mesmo registro (linha).
X | S | |
X | Não compatível | Não compatível |
S | Não compatível | compatível |
Granularidade de bloqueio : O mecanismo de armazenamento InnoDB suporta bloqueio multigranularidade, o que permite que as transações tenham bloqueios em nível de linha e bloqueios em nível de tabela ao mesmo tempo. Para suportar operações de bloqueio em diferentes granularidades, o mecanismo de armazenamento InnoDB oferece suporte a um método de bloqueio adicional chamado bloqueio de intenção. Os bloqueios de intenção dividem os objetos bloqueados em vários níveis. Os bloqueios de intenção significam que as transações desejam ser bloqueadas com uma granularidade mais refinada.
O mecanismo de armazenamento InnoDB suporta um design relativamente simples de bloqueios de intenção, e seus bloqueios de intenção são bloqueios em nível de tabela. O principal objetivo do design é revelar o tipo de bloqueio solicitado para a próxima linha de uma transação. Ele suporta dois tipos de bloqueios de intenção:
1. Intenção de bloqueio compartilhado (IS Lock), a transação deseja obter bloqueios compartilhados para determinadas linhas de uma tabela.
2. Intenção de bloqueio exclusivo (IX Lock), a transação deseja obter bloqueios exclusivos em determinadas linhas de uma tabela.
Como o mecanismo de armazenamento InnoDB suporta bloqueios em nível de linha, os bloqueios intencionais não bloquearão nenhuma solicitação, exceto verificações completas da tabela. Portanto, a compatibilidade dos bloqueios de intenção em nível de tabela e bloqueios em nível de linha é a seguinte:
É | IX | S | X | |
É | compatível | compatível | compatível | Não compatível |
IX | compatível | compatível | Não compatível | Não compatível |
S | compatível | Não compatível | compatível | Não compatível |
X | Não compatível | Não compatível | Não compatível | Não compatível |
algoritmo de bloqueio: O mecanismo de armazenamento InnoDB possui três algoritmos de bloqueio de linha, que são:
1. Bloqueio de registro: bloqueio em um registro de linha única.
2. Bloqueio de lacuna: bloqueio de lacuna, bloqueio
3. Next-Key Lock: Gap Lock + Record Lock, bloqueia um intervalo e bloqueia o próprio registro.
O Record Lock sempre bloqueará os registros de índice. Se a tabela do mecanismo de armazenamento InnoDB não estiver configurada com nenhum índice quando for criada, o mecanismo de armazenamento InnoDB usará a chave primária implícita para bloqueio. Next-Key Lock é um algoritmo de bloqueio que combina Gap Lock e Record Lock No algoritmo Next-Key Lock, o InnoDB usa esse algoritmo de bloqueio para consultas de linha. A tecnologia de bloqueio usando Next-Key Lock é chamada de Next-Key Locking e seu design não se destina a resolver o Problema Fantasma (leitura fantasma). Usando esta tecnologia de bloqueio, o que é bloqueado não é um valor único, mas um intervalo, que é uma melhoria do Predict Lock.
Sobre impasse : Deadlock refere-se a um fenômeno de duas ou mais transações esperando uma pela outra devido à competição por recursos durante a execução. Sem força externa, os assuntos não poderão avançar.
atualização de bloqueio :O escalonamento de bloqueio refere-se à redução da granularidade do bloqueio atual. Por exemplo, o banco de dados pode atualizar os bloqueios de 1.000 linhas de uma tabela para um bloqueio de página ou atualizar um bloqueio de página para um bloqueio de tabela.
O mecanismo de armazenamento InnoDB não apresenta problemas de atualização de bloqueio. Por não gerar bloqueios de linha com base em cada registro, pelo contrário, gerencia os bloqueios com base em cada página acessada por cada transação, utilizando um método bitmap. Portanto, quer uma transação bloqueie um registro ou vários registros na página, o custo geralmente é o mesmo.
O mecanismo de armazenamento InnoDB possui três algoritmos de bloqueio de linha, e o gap lock (Gap Lock) é um deles. Os bloqueios de lacuna são usados para bloquear um intervalo, mas não os registros em si. Sua finalidade é evitar que múltiplas transações insiram registros no mesmo intervalo, o que pode levar a problemas de leitura fantasma.
O bloqueio em nível de linha do InnoDB é implementado bloqueando entradas de índice no índice. O InnoDB usa bloqueios em nível de linha somente quando os dados são recuperados por meio de condições de índice, caso contrário, o InnoDB usa bloqueios de tabela.
Quando certas linhas de uma tabela são bloqueadas, diferentes transações podem usar índices diferentes para bloquear linhas diferentes. Além disso, seja usando índice de chave primária, índice exclusivo ou índice comum, o InnoDB usará bloqueios de linha para bloquear os dados.
Deadlock refere-se a um fenômeno no qual duas ou mais transações esperam uma pela outra devido à competição por recursos durante a execução. Sem força externa, os assuntos não poderão avançar.A tabela a seguir demonstra uma situação clássica de deadlock, ou seja, A espera por B e B espera por A. Esse problema de deadlock é denominadoImpasse AB-BA。
tempo | Sessão A | Sessão B |
1 | COMEÇAR: | |
2 | mysql>SELECIONE * DE t ONDE a = 1 PARA ATUALIZAÇÃO; ************1.linha************ a:1 1 linha no conjunto (0,00 seg) | COMEÇAR: |
3 | mysql>SELECIONE * DE t ONDE a = 2 PARA ATUALIZAÇÃO; ************1.linha************ a:2 1 linha no conjunto (0,00 seg) | |
4 | mysql>SELECIONE * DE t ONDE a = 2 PARA ATUALIZAÇÃO; #espere | |
5 | mysql>SELECIONE * DE t ONDE a = 1 PARA ATUALIZAÇÃO; ERRO 1213(40001): Deadlock encontrado ao tentar obter bloqueio; tente reiniciar a transação |
A maneira mais simples de resolver o problema do impasse é expirar, ou seja, quando duas transações esperam uma pela outra, quando um tempo de espera excede um limite definido, uma das transações é revertida e a outra transação em espera pode continuar.
Além do mecanismo de tempo limite, os bancos de dados atuais geralmente também usam o método de gráfico de espera (gráfico de espera) para detecção de impasse. Esta é uma abordagem mais proativa para detecção de deadlock do que a solução de tempo limite. Esta abordagem também é adotada pelo mecanismo de armazenamento InnoDB. O gráfico de espera requer que o banco de dados armazene os dois tipos de informações a seguir:
1. Bloqueie lista de informações;
2. Lista de espera de transações;
Um gráfico pode ser construído através da lista vinculada acima, e se houver um loop neste gráfico, significa que há um impasse, então os recursos esperam uns pelos outros. Este é um mecanismo de detecção de deadlock mais ativo. Quando cada transação solicita um bloqueio e espera, ele determinará se há um loop. Se existir, há um deadlock. a menor quantidade de desfazer.