XOOPS Brasil

 

E.4. Métodos de Lock

Atualmente o MySQL só suporta bloqueios de tabela para tipos ISAM/MyISAM e HEAP, bloqueios a nível de página para tabelas BDB e bloqueio a nivel de registros para tabelas InnoDB. Veja mais informações sobre isto na Seção 5.3.1, “Como o MySQL Trava as Tabelas”. Com tabelas MyISAM pode se misturar livremente INSERT e SELECT sem travas, se as instruções INSERTs não são confiltantes. (ex.: se eles são inseridos no fim da tabela em vez de preencherem espaços liberados por dados/linhas deletados).

A partir da versão 3.23.33, você pode analisar a contenção do bloqueio de tabela no seu sistema verificando as variáveis de ambiente Table_locks_waited e Table_locks_immediate.

Para decidir se você quer usar um tipo de tabela com bloqueio a nível de registro, você deverá olhar o que o aplicativo faz e o qual é o padrão de seleção/atualização dos dados.

Pontos a favor do bloqueios de registros:

  • Poucos conflitos de bloqueios ao acessar registros diferentes em muitas threads.

  • Poucas alterações para rollback.

  • Torna possível bloquear um único registro por um longo tempo.

Contras:

  • Gasta mais memória que bloqueios a nível de página ou tabela.

  • É mais lento que bloqueios a nível de página ou tabela quando usado em uma grande parte da tabela, pois deve-se fazer muito mais travamentos.

  • É difinitivamente muito pior que outras travas se você frequentemente utiliza GROUP BY em uma grande parte dos dados ou é feita uma varredura de toda a tabela.

  • Com nível de bloqueios mais altos pode-se também, com mais facilidade, suportar travas de diferentes tipos para sintonizar a aplicação já que a sobreposição de bloqueio é menos perceptível que para bloqueios a nível de registro.

Bloqueios de tabela são superiores a bloqueios a nível de página / registro nos seguintes casos:

  • Muitas leituras

  • Leituras e atualizações em chaves restritas; é onde atualiza ou deleta-se um registro que pode ser buscado com uma leitura de chave:

    UPDATE nome_tbl SET coluna=valor WHERE unique_key#
    DELETE FROM nome_tbl WHERE unique_key=#
    

  • SELECT combinado com INSERT (e muito poucas instruções UPDATEs e DELETEs).

  • Muitas varreduras / GROUP BY em toda a tabela sem nenhuma escrita.

Outra opções além de bloqueios a nível de página / registro:

Versioning (como usamos no MySQL para inserções concorrentes) onde você pode ter um escrita e várias leituras ao mesmo tempo. Isto significa que o banco de dados/tabelas suporta diferentes viiews para os dados dependendo de quando se começa a acessá-lo. Outros nomes deste recurso são time travel, cóia na escrita ou cópia por demanda.

Cópia por demanda é em muitos casos muito melhor que bloqueio a nível de registro ou página; o piro caso, no entanto, usa muito mais memória que a usada em travamentos normais.

Em vez de se usar bloqueio de registro pode-se usar bloqueios no aplicativo (como get_lock/release_lock no MySQL). Isto só funciona em aplicaticos bem comportados.

Em muitos casos pode se fazer um palpite sobre qual tipo de bloqueio é melhor para a aplicação. mas geralmente é muito difícil dizer que um dado tipo de bloqueio é melhor que outro; tudo depende da aplicação e diferentes partes da aplicação podem exigir diferentes tipos de bloqueios.

Aqui estão algumas dicas sobre travamento no MySQL:

A maioria das aplicações web fazem diversos selects, muito poucas deleções, atualizaoes principalmente nas chaves e inserções em tabelas específicas. A configuração base do MySQL é bem sitonizada para esta finalidade.

Utilizadores concorrentes não são um problema se eles não misturam atualizações com seleções que precisam examinar muitas linhas na mesma tabela.

Se é misturado inserções e exclusões na mesma tabela então INSERT DELAYED pode ser de grande ajuda.

Pode se também usar LOCK TABLES para aumentar a velocidade (muitas atualizações com um travamento simples é muito mais rápida que atualizações sem travamento). Separar as coisas em tabelas diferentes também ajudará.

Se você tiver problemas de velocidade com travamento de tabelas no MySQL, você pode estar apto a resolver isto convertendo alguma de suas tabelas para tipos InnoDB ou BDB. Veja mais informações sobre isto na Seção 7.5, “Tabelas InnoDB. Veja mais informações sobre isto na Seção 7.6, “Tabelas BDB ou BerkeleyDB.

A seção de otimização no manual cobre diversos aspectos de como sintonizar a sua aplicação. Veja mais informações sobre isto na Seção 5.2.13, “Mais Dicas sobre Otimizações”.