Capítulo 9. Controle de concorrência

Índice
9.1. Introdução
9.2. Isolamento da transação
9.2.1. Nível de isolamento Read Committed
9.2.2. Nível de isolamento serializável
9.3. Bloqueio explícito
9.3.1. Bloqueios no nível de tabela
9.3.2. Bloqueios no nível de linha
9.3.3. Impasses
9.4. Verificação da consistência dos dados no nível da aplicação
9.5. Bloqueio e índices

Este capítulo descreve o comportamento do sistema gerenciador de banco de dados PostgreSQL, quando duas ou mais sessões tentam acessar os mesmos dados ao mesmo tempo. O objetivo nesta situação é permitir o acesso eficiente para todas as sessões mantendo, ao mesmo tempo, uma rigorosa integridade dos dados. Todos os desenvolvedores de aplicação de banco de dados devem estar familiarizados com os tópicos cobertos por este capítulo.

9.1. Introdução

Diferentemente dos sistemas gerenciadores de banco de dados tradicionais, que usam bloqueios para realizar o controle de concorrência, o PostgreSQL mantém a consistência dos dados utilizando o modelo multiversão (Multiversion Concurrency Control, MVCC). Isto significa que ao consultar o banco de dados, cada transação enxerga um instantâneo (snapshot) dos dados (uma versão do banco de dados) conforme estes dados eram há algum tempo atrás, sem levar em consideração o estado corrente dos dados subjacentes. Este modelo impede que a transação enxergue dados inconsistentes, que poderiam ser causados por atualizações feitas por transações concorrentes nas mesmas linhas de dados, fornecendo um isolamento da transação para cada uma das sessões do banco de dados.

A diferença principal entre os modelos multiversão e de bloqueio é que, no MVCC, os bloqueios obtidos para consultar (ler) os dados não conflitam com os bloqueios obtidos para escrever os dados e, portanto, a leitura nunca bloqueia a escrita, e a escrita nunca bloqueia a leitura.

As funcionalidades de bloqueio, no nível de tabela e de linha, também estão disponíveis no PostgreSQL para aplicações que não podem se adaptar facilmente ao comportamento MVCC. Entretanto, a utilização apropriada do MVCC geralmente produz um desempenho melhor que os bloqueios.