O que pode resultar do enfraquecimento do nível de isolamento de transações nos bancos de dados

Olá a todos. Em contato com Vladislav Rodin. Atualmente, sou o chefe do curso de arquiteto de carga alta da OTUS e também ensino cursos de arquitetura de software.

Além do ensino, como você deve ter notado, também estou escrevendo material com direitos autorais para o blog OTUS no hub e quero coincidir com o artigo de hoje para lançar o curso "PostgreSQL" , atualmente aberto para recrutamento.




Introdução


A última vez que você e eu conversamos sobre essa transação em bancos de dados usados ​​para dois propósitos: garantir tolerância a falhas e acesso a dados em um ambiente competitivo. Para concluir essas tarefas, uma transação deve ter propriedades ACID. Hoje falaremos em detalhes sobre a letra I (isolamento) nesta abreviação.


Isolamento


O isolamento resolve o problema de acessar dados em um ambiente competitivo, fornecendo efetivamente proteção contra as condições da corrida. Idealmente, isolamento significa serialização, ou seja, uma propriedade que garante que o resultado da execução de transações em paralelo seja o mesmo que se elas fossem executadas sequencialmente. O principal problema dessa propriedade é que é tecnicamente muito difícil de fornecer e, como resultado, tem um impacto significativo no desempenho do sistema. É por isso que o isolamento é frequentemente enfraquecido, aceitando os riscos de algumas anomalias, que serão discutidas abaixo. A possibilidade da ocorrência de certas anomalias da mesma forma caracteriza o nível de isolamento da transação.

As anomalias mais famosas são: leitura suja, leitura não repetível, leitura fantasma, mas, na verdade, existem mais 5: gravação suja, atualização perdida do cursor, atualização perdida, atualização perdida, inclinação da leitura, inclinação da gravação.

Gravação suja


A essência da anomalia é que as transações podem substituir dados não confirmados.

imagem

Essa anomalia é perigosa não apenas porque os dados podem entrar em conflito após a confirmação de ambas as transações (como na figura), mas também porque a atomicidade é violada: porque permitimos sobrescrever dados não bloqueados, não está claro como reverter uma transação sem atingir a outra. .

A anomalia é tratada de maneira simples: desligamos o bloqueio de gravação antes do início da gravação, proibindo outras transações de alterar o registro até que o bloqueio seja liberado.

Leitura suja


Leitura suja significa ler dados não confirmados.

imagem

Os problemas surgem quando, com base em uma amostra, é necessário realizar algumas ações ou tomar decisões.

Para corrigir a anomalia, você pode travar um bloqueio de leitura, mas ele afetará muito o desempenho. É muito mais simples dizer que, para uma transação de reversão, o estado inicial dos dados (antes da gravação) deve ser armazenado no sistema. Por que não ler a partir daí? Como é bastante barato, a maioria dos bancos de dados remove a leitura suja por padrão.

Atualização perdida


Atualização perdida significa atualizações perdidas e a tradução reflete com precisão a essência do problema:

imagem

De fato, o resultado da transação T2 foi cancelado. Essa situação é corrigida por bloqueios de gravação explícitos ou implícitos. Ou seja, simplesmente atualizamos o registro e, em seguida, ocorre um bloqueio implícito ou executamos a seleção para atualização , causando um bloqueio de leitura e gravação. Observe que essa operação é bastante perigosa: com nossa leitura "inocente", bloqueamos outras leituras. Alguns bancos de dados oferecem uma seleção para compartilhamento mais segura, que permite a leitura de dados, mas não a alteração.

Atualização perdida do cursor


Para um controle mais preciso, as bases podem oferecer outras ferramentas, por exemplo, um cursor. Um cursor é uma estrutura que contém um conjunto de linhas e permite iterar sobre elas. declare cursor_name para select_statement . O conteúdo do cursor é descrito por select.

Por que precisamos de um cursor? O fato é que alguns bancos de dados oferecem bloqueio em todos os registros selecionados por select (estabilidade de leitura) ou apenas no registro em que o cursor está atualmente localizado (estabilidade do cursor). Com a estabilidade do cursor, um bloqueio curto é implementado, o que nos permite reduzir o número de bloqueios se iterarmos em uma grande amostra de dados. Portanto, a anomalia de atualização perdida é destacada separadamente para o cursor.

Leitura não repetível


A leitura não repetível é que, durante a execução de nossa transação, duas leituras consecutivas do mesmo registro levarão a resultados diferentes, porque outra transação interveio entre essas duas leituras, alterou nossos dados e foi confirmada.

imagem

Por que isso é um problema? Imagine que o objetivo da transação T2 na imagem é selecionar todos os produtos cujo preço seja inferior a 150 cu Alguém atualizou o preço para US $ 200 Portanto, o filtro instalado não funcionou.

Essas anomalias deixam de ocorrer quando bloqueios de duas fases são adicionados ou ao usar o mecanismo MVCC, sobre o qual gostaria de falar separadamente.

Leitura fantasma


O Phantom está lendo dados que foram adicionados por outra transação.

imagem

Como exemplo, você pode observar a seleção incorreta do produto mais barato quando essa anomalia ocorre.

Livrar-se das leituras fantasmas já é bastante difícil. O bloqueio normal não é suficiente, porque não conseguiríamos bloquear o que ainda não está disponível. Os sistemas 2PL usam bloqueio preditivo, enquanto os sistemas MVCC usam um agendador de transações para cancelar transações que podem ser interrompidas por uma inserção. O primeiro e o segundo mecanismos são bastante pesados.

Ler inclinação


A inclinação da leitura surge quando trabalhamos com várias tabelas, cujo conteúdo deve mudar de maneira consistente.

Suponha que existam tabelas representando postagens e suas meta-informações:

imagem

uma transação lê das tabelas, outra as altera:

imagem

Como resultado da transação T1, a postagem tem o título = Bom e updated_by = T2, o que é alguma inconsistência.

De fato, esta é uma leitura não repetível, mas como parte de várias tabelas.

Para correção, o T1 pode desligar os bloqueios em todas as linhas que ele ler, o que impedirá o T2 de alterar as informações. No caso do MVCC, a transação T2 será cancelada. A proteção contra essa anomalia pode se tornar importante se usarmos cursores.

Escrever inclinação


Essa anomalia também é mais fácil de explicar com um exemplo: suponha que em nosso sistema pelo menos um médico deva estar de plantão, mas ambos os médicos decidem cancelar seu dever: A

imagem

imagem

anomalia levou ao fato de que nenhum dos médicos entrará em serviço. Por quê isso aconteceu? Como a transação verificou uma condição que pode ser violada por outra transação e, devido ao isolamento, não vimos essa alteração.

Esta é a mesma leitura não repetível. Como alternativa, os seletores podem travar bloqueios nesses registros.

A inclinação da gravação e a inclinação da leitura são combinações de anomalias anteriores. Você pode considerar a inclinação da gravação, que é essencialmente uma leitura fantasma. Considere uma tabela na qual há nomes de funcionários, salário e projeto em que trabalham:

imagem

imagem

Como resultado, temos a seguinte imagem: cada gerente pensou que sua mudança não levaria a um orçamento, e por isso fez mudanças de pessoal, o que no total levou a uma superação.

A causa do problema é exatamente a mesma da leitura fantasma.

achados


Diminuir o nível de isolamento de transação no banco de dados é um compromisso entre segurança e desempenho; a escolha desse nível deve ser abordada com base nos riscos potenciais para os negócios no caso de qualquer anomalia.



Saiba mais sobre o curso.



All Articles