Inconsistência na leitura repetível

10

http://www.postgresql.org/docs/9.2/static/transaction-iso.html

O modo Leitura Repetível fornece uma garantia rigorosa de que cada transação tenha uma visão completamente estável do banco de dados. No entanto, essa visão nem sempre será sempre consistente com alguma execução serial (uma de cada vez) de transações simultâneas do mesmo nível. Por exemplo, mesmo uma transação somente leitura nesse nível pode ver um registro de controle atualizado para mostrar que um lote foi concluído, mas não ver um dos registros detalhados que fazem parte do lote logicamente porque leu uma revisão anterior do registro de controle . As tentativas de impor regras de negócios por transações executadas nesse nível de isolamento provavelmente não funcionarão corretamente sem o uso cuidadoso de bloqueios explícitos para bloquear transações conflitantes.

Não é uma leitura fantasma, o que não é possível no modo de leitura repetível?

A documentação diz que uma consulta em uma transação de leitura repetível vê um instantâneo desde o início da transação; então, como seria possível uma consulta ler dados inconsistentes?

Alice
fonte

Respostas:

5

Aqui está a minha leitura dessa seção. Admito que é confuso.

Suponha que eu tenha duas tabelas:

CREATE TABLE batch (
   id serial not null unique,
   control_code text primary key,
   date_posted date not null default now()
);

CREATE TABLE details (
   batch_id int not null references batch(id),
   description text,
   primary key(batch_id, description)
);

Agora, suponha que insira registros de lote e detalhes em transações diferentes. A sessão 1 insere um lote e começa a inserir detalhes, mas antes de terminar, a sessão 2 é iniciada. A sessão 2 consegue ver as informações do cabeçalho do lote, mas não espera os detalhes da confirmação para informar ao usuário que nenhum registro foi encontrado. Agora, se o lote e os detalhes estiverem inteiramente na mesma transação, isso nunca será um problema.

isso seria diferente de serializável, onde você esperaria que a inserção anterior fosse concluída e confirmada ou revertida antes de determinar se notifica o usuário de que nenhuma linha foi encontrada.

Chris Travers
fonte
3

um documento no Wiki do PostgreSQL que mostra alguns problemas que podem ocorrer com certas combinações de transações no nível de isolamento de transação REPEATABLE READ e como eles são evitados no nível de isolamento de transação SERIALIZABLE que começa no PostgreSQL versão 9.1.

Ele também inclui um exemplo de como seria possível uma transação REPEATABLE READ-ONLY READ ONLY ler dados inconsistentes.

907º
fonte
@dezso você poderia estar interessado em que
907
1

As leituras fantasmas (não confunda isso com leituras não repetíveis) são possíveis no nível de isolamento "Leitura repetível" ... em princípio. Mas o comportamento de fato do Postgresql quando você seleciona "Leitura repetível" é mais forte que o padrão (quase um isolamento "Serializable"), de modo que, na verdade, você não terá leituras fantasmas. Documentos :

Quando você seleciona o nível Read Uncommitted, você realmente obtém Read Committed, e leituras fantasmas não são possíveis na implementação do PostgreSQL de Repeatable Read , portanto o nível de isolamento real pode ser mais rígido do que o que você seleciona.

Agora, o que dizer dessa ressalva "essa visão nem sempre será consistente com alguma execução serial (uma de cada vez) de transações simultâneas do mesmo nível"? Eu acho (não tenho certeza) que isso significa que o instantâneo "de fora" (corrigido no início da transação) pode eventualmente incluir linhas de outras transações, mas falha ao incluir outras linhas da mesma transação.

leonbloy
fonte