Alexandre.Gaigalas.Net

Desenvolvedor, autor e projetista de interfaces.

Controlar o nível de isolamento de consultas no MySQL

Transações em bancos de dados SQL são ACID:

  • Atômicas (uma transação não pode ser dividida e tratada em partes)
  • Consistentes (uma transação interrompida não deixa vestígios)
  • Isoladas (uma transação nunca interage com outra até terminar)
  • Duráveis (se algo acontecer errado, o banco saberá voltar as alterações. Persistentes seria melhor, mas ACIP fica estranho).

São características fantásticas do ponto de vista funcional, mas geram problemas. O isolamento é uma frequente causa de problemas de performance, porque faz com que as tabelas fiquem travadas em determinadas transações. Se uma tabela com atualizações frequentes é também alvo de consultas demoradas e complexas, que cobrem uma grande quantidade de registros, é possível que uma grande fila de processos se acumule.

A maneira simples de evitar isso é controlar o nível de isolamento (e romper o princípio ACID) utilizando o comando SET TRANSACTION ISOLATION LEVEL. Quatro variações são possíveis:

  • SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED, pra ler dados de quaisquer transações não-completadas
  • SET TRANSACTION ISOLATION LEVEL READ COMMITTED, pra ler dados somente de transações completas, incluindo comandos internos
  • SET TRANSACTION ISOLATION LEVEL REPEATABLE READ, pra ler dados somente de transações completas
  • SET TRANSACTION ISOLATION LEVEL SERIALIZABLE, pra utilizar em conjunto com SELECT…LOCK IN SHARE MODE

A diferença real entre o READ COMMITED e o REPEATABLE READ acontece em transações com mais de um comando. Se você enviar, por exemplo, uma série de consultas e atualizações dentro de uma mesma transação, os dois modos lerão dados de pontos diferentes:

  • READ COMMITED atualizará os dados de leitura a cada comando. Um update em seguida do outro utilizará os dados atualizados, respeitando a transação no qual eles se encontram.
  • REPEATABLE READ utilizará sempre um único conjunto de dados inicial. Se você efetuar várias atualizações, as leituras serão feitas do mesmo conjunto inicial sempre, relativo ao início da transação. Esse é o modo padrão no MySQL.

1 Comment to Controlar o nível de isolamento de consultas no MySQL

  1. Bullshico's Gravatar Bullshico
    23/10/2009 at 11:36 | Permalink

    Muito bom o post. Parabéns!

Comentar

Você pode usar os seguintes HTML atributos e tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>