Níveis de Isolamento no DB2: RR, RS, CS e UR

O DB2 oferece quatro níveis de isolamento que controlam como transações concorrentes interagem com os dados. Cada nível equilibra de forma diferente a consistência dos dados e a concorrência do sistema.

  1. Repeatable Read (RR)

Neste nível mais restritivo, o DB2 bloqueia todos os registros acessados durante a execução de uma instrução SQL. Isso significa que, durante a varredura da consulta, cada linha encontrada recebe um bloqueio correspondente ao tipo de operação realizada:

  • Operações de leitura: aplicam bloqueios compartilhados (S)
  • Operações de modificação: aplicam bloqueios exclusivos (X)

Como todos os registros percorridos são bloqueados, a quantidade de locks pode crescer significativamente. Nesse cenário, a presença de índices exerce grande impacto, pois reduz o número de linhas que precisam ser varridas e, consequentemente, diminui a quantidade de bloqueios gerados.

  1. Read Stability (RS)

Este nível é menos rigoroso que o RR. Em vez de bloquear todas as linhas percorridas, o RS bloqueia apenas as linhas que satisfazem os critérios de filtro da consulta. Se a instrução SQL não contiver cláusula de filtragem, todas as linhas da tabela serão bloqueadas.

Esse comportamento garante que, dentro de uma mesma transação, os registros já lidos não sofram alterações por outras transações concorrentes, embora novas linhas possam ser inseridas (caracterizando leitura fantasma).

  1. Cursor Stability (CS)

O CS é o nível de isolamento padrão do DB2 e oferece um equilíbrio entre consistência e concorrência. Ele mantém o bloqueio apenas sobre a linha atualmente posicionada pelo cursor. Assim que o cursor avança para o próximo registro, o bloqueio da linha anterior é liberado.

Esse nível evita leitura suja, mas não impede leitura não repetível nem leitura fantasma.

  1. Uncommitted Read (UR)

O UR permite a leitura de dados ainda não confirmados (leitura suja). Para operações exclusivamente de leitura, nenhum bloqueio de linha é aplicado. Para operações que envolvem modificação de dados, o comportamento de bloqueio é equivalente ao do CS.

É especialmente útil em consultas analíticas ou de relatório onde a exatidão pontual dos dados não é crítica e a prioridade é a performance.


Aálise Prática de Bloqueios

A seguir, demonstramos o comportamento dos bloqueios em diferentes cenários. Criamos uma tabela de testes:

-- Criação da tabela de exemplo
CREATE TABLE exemplo_tab (
    codigo INTEGER
);

-- Inserção de dados iniciais
INSERT INTO exemplo_tab VALUES (100);
COMMIT;

Cenário 1: Consulta padrão (sem UR)

Ao executar uma consulta de contagem sem especificar WITH UR, o DB2 aplica bloqueios compartilhados (S) sobre as linhas lidas. Isso significa que operações de UPDATE concorrentes precisarão aguardar a liberação dos bloqueios.

-- Conexão A: consulta com bloqueio ativo
SELECT COUNT(*) FROM exemplo_tab;

-- Monitorando os bloqueios ativos
-- (em terminal separado)
db2pd -d base_teste -lock

O resultado do db2pd mostra um bloqueio interno no modo S (compartilhado) mantido pela transação de leitura.

Cenário 2: Atualização concorrente

Em outra sessão, tentamos atualizar o mesmo registro:

-- Conexão B: tentativa de atualização
UPDATE exemplo_tab SET codigo = 200;

Neste momento, o monitor de bloqueios exibe um bloqueio de linha no modo X (exclusivo) solicitado pela transação de escrita, além de um bloqueio de tabela no modo IX (intenção exclusiva).

Cenário 3: Consulta com WITH UR

Ao adicionar FOR READ ONLY WITH UR, o comportamento muda significativamente:

-- Conexão A: consulta sem bloqueios de leitura
SELECT COUNT(*) FROM exemplo_tab 
    FOR READ ONLY WITH UR;

-- Conexão B: atualização simultânea
UPDATE exemplo_tab SET codigo = 200;

Desta vez, a consulta de leitura não gera bloqueios de linha. A operação de UPDATE concorrente é executada imediatamente, sem necessidade de aguardar. O monitor de bloqueios mostra apenas o bloqueio X da transação de escrita e o bloqueio IX de tabela, sem qualquer bloqueio S oriundo da leitura.


Resumo Comparativo

Nível Leitura Suja Leitura Não Repetível Leitura Fantasma Concorrrência
UR (Uncommitted Read) Permitida Permitida Permitida Máxima
CS (Cursor Stability) Evitada Permitida Permitida Alta
RS (Read Stability) Evitada Evitada Permitida Média
RR (Repeatable Read) Evitada Evitada Evitada Baixa
  • UR: Permite ler dados ainda não commitados. Consultas não aguardam operações de UPDATE em andamento, não aplicando bloqueios de linha para leitura.
  • CS: Mantém bloqueio apenas sobre a linha atualmente apontada pelo cursor. É o nível padrão do DB2. Evita leitura suja, mas não garante repetibilidade da leitura nem evita leitura fantasma.
  • RS: Bloqueia todas as linhas pertencentes ao conjunto de resultados da consulta dentro da transação. Previne leitura não repetível, porém ainda permite leitura fantasma.
  • RR: Bloqueia todas as linhas acessadas durante a varredura. Oferece serialização completa das operações sobre a tabela consultada, evtiando todos os problemas de concorrência, ao custo de menor paralelismo.

Tags: DB2 isolation-levels database-concurrency locking SQL

Publicado em 9-13 07:43