Sobes.tech
Middle

Quais os níveis de isolamento de transações existem?

sobes.tech IA

Resposta da IA

Os níveis de isolamento de transações em SQL determinam até que ponto uma transação pode ver alterações não confirmadas feitas por outras transações. São projetados para prevenir problemas de acesso concorrente: leitura suja, leitura não repetível e leitura fantasma.

Existem quatro níveis padrão de isolamento:

  1. READ UNCOMMITTED (Leitura não confirmada)
    • O nível mais baixo.
    • A transação pode ver alterações não confirmadas de outras transações (permite leitura suja).
    • Não previne leitura não repetível nem leitura fantasma.
  2. READ COMMITTED (Leitura confirmada)
    • Previna a leitura suja. A transação vê apenas as alterações que foram confirmadas antes ou durante a consulta.
    • Permite leitura não repetível e leitura fantasma.
  3. REPEATABLE READ (Leitura repetível)
    • Previna leitura suja e leitura não repetível. Se a transação lê uma linha várias vezes, ela sempre vê o mesmo valor, a menos que ela mesma a tenha alterado.
    • Permite leitura fantasma (outras transações podem inserir novas linhas que serão visíveis em consultas repetidas em intervalos).
  4. SERIALIZABLE (Serializável)
    • Elimina todos os problemas de acesso concorrente: leitura suja, leitura não repetível e leitura fantasma.
    • As transações são executadas como se fossem sequenciais, uma após a outra.
    • O nível mais alto, mas também o mais lento, pois requer mais bloqueios.

Tabela comparativa de problemas prevenidos em cada nível:

Nível de isolamento Leitura suja Leitura não repetível Leitura fantasma
READ UNCOMMITTED Não Não Não
READ COMMITTED Sim Não Não
REPEATABLE READ Sim Sim Não
SERIALIZABLE Sim Sim Sim

A escolha do nível de isolamento depende dos requisitos da aplicação em relação à consistência dos dados e desempenho. Os níveis mais altos garantem maior integridade, mas podem reduzir o paralelismo.

Em Python, ao trabalhar com bancos de dados (por exemplo, com sqlite3, bibliotecas para PostgreSQL psycopg2, para MySQL mysql.connector), geralmente é possível definir o nível de isolamento através do método correspondente da conexão ou cursor.

Exemplo de configuração do nível de isolamento em sqlite3:

# Importar a biblioteca
import sqlite3

# Conexão ao banco de dados
conn = sqlite3.connect('mydatabase.db', isolation_level='REPEATABLE READ')
# Em vez de 'REPEATABLE READ', pode usar None (equivalente a READ UNCOMMITTED), 'DEFERRED', 'IMMEDIATE', 'EXCLUSIVE'

# Uso do cursor
cursor = conn.cursor()

# Trabalhar com o banco de dados...

# Confirmar alterações
conn.commit()

# Fechar conexão
conn.close()

Exemplo de configuração do nível de isolamento em psycopg2:

# Importar a biblioteca
import psycopg2
# Importar as constantes de níveis de isolamento
from psycopg2.extensions import ISOLATION_LEVEL_READ_COMMITTED, ISOLATION_LEVEL_SERIALIZABLE

# Conexão ao banco de dados
conn = psycopg2.connect(database="mydatabase", user="myuser", password="mypassword", host="localhost")

# Definir o nível de isolamento
conn.set_isolation_level(ISOLATION_LEVEL_SERIALIZABLE)
# Pode usar ISOLATION_LEVEL_READ_UNCOMMITTED, ISOLATION_LEVEL_READ_COMMITTED, ISOLATION_LEVEL_REPEATABLE_READ, ISOLATION_LEVEL_SERIALIZABLE

# Uso do cursor
cursor = conn.cursor()

# Trabalhar com o banco de dados...

# Confirmar alterações
conn.commit()

# Fechar conexão
conn.close()

Os níveis padrão de isolamento oferecem um equilíbrio entre consistência e desempenho. Na prática, os mais utilizados são READ COMMITTED e SERIALIZABLE.