Gerenciamento de Transações em Banco de Dados: ACID, Concorrência e Bloqueio
Classificado em Computação
Escrito em em português com um tamanho de 66,18 KB
Transações em Banco de Dados
Uma transação é uma unidade de execução de programa que acessa e possivelmente atualiza vários itens de dados. Normalmente, é iniciada por um programa escrito em uma linguagem de manipulação de dados (C, C++, Java, Perl, etc.).
É delimitada pelas instruções BEGIN TRANSACTION e COMMIT, consistindo de todas as operações executadas entre elas.
Propriedades ACID para Transações
Para garantir a integridade dos dados, o SGBD deve manter as propriedades ACID:
- Atomicidade
- Consistência
- Isolamento
- Durabilidade
Detalhes das Propriedades ACID
Atomicidade: Ou todas as operações da transação são refletidas corretamente no banco de dados, ou nenhuma delas é.
Consistência: A execução de uma transação isolada preserva a consistência do banco de dados.
Isolamento: Embora várias transações possam ser executadas simultaneamente, cada transação precisa estar alheia às outras transações que estão sendo executadas ao mesmo tempo. Os resultados intermediários da transação precisam estar ocultos das outras transações sendo executadas simultaneamente.
Ou seja, para cada par de transações, Ti e Tj, parece a Ti que Tj terminou a execução antes que Ti começasse, ou Tj iniciou a execução depois que Ti terminou.
Em outras palavras, cada transação não está ciente das outras transações executando simultaneamente no sistema.
Durabilidade: Depois que uma transação for completada com sucesso, as mudanças que ela fez no banco de dados persistem, mesmo que ocorram falhas no sistema.
Operações de Acesso a Dados
Transações acessam os dados usando duas operações:
- Read(X) – transfere o item de dados X do banco de dados (disco) para o buffer da transação (memória).
- Write(X) – transfere o item de dados X do buffer da transação para o banco de dados.
Observação: Em muitos SGBDs, a operação Write não resulta na atualização imediata dos dados no disco.
Estados de uma Transação
Uma transação pode passar pelos seguintes estados:
- Ativa: O estado inicial; a transação permanece nesse estado enquanto está executando.
- Parcialmente Confirmada: Depois que a instrução final foi executada.
- Falha: Depois da descoberta de que a execução normal não pode mais prosseguir.
- Abortada: Depois que a transação foi revertida e o banco de dados foi restaurado ao seu estado anterior ao início da transação. Duas opções após ter sido abortada:
- Reiniciar a transação: Pode ser feito apenas se não houver qualquer erro lógico interno.
- Excluir a transação.
- Confirmada: Após o término bem-sucedido.
Concorrência de Transações
Várias transações podem ser executadas simultaneamente no sistema. As vantagens são:
- Melhor utilização do processador e do disco, levando a um melhor throughput de transação: uma transação pode estar usando a CPU enquanto outra está lendo ou escrevendo no disco.
- Tempo médio de resposta reduzido para transações: as transações curtas não precisam esperar atrás das longas.
Esquemas de controle de concorrência: Mecanismos para obter isolamento; ou seja, para controlar a interação entre as transações concorrentes a fim de evitar que elas destruam a consistência do banco de dados.
A consistência do banco de dados pode ser destruída apesar da exatidão de cada transação individual.
Conceito de Schedule
Schedule: Sequências de instruções que especificam a ordem cronológica em que as instruções das transações simultâneas são executadas.
- Um schedule para um conjunto de transações precisa consistir em todas as instruções dessas transações.
- Precisam preservar a ordem em que as instruções aparecem em cada transação individual.
Níveis de Isolamento SQL e Fenômenos
O padrão SQL define 4 níveis de isolamento em termos de 3 fenômenos que devem ser evitados pelo processamento concorrente. São eles:
- Leitura de Sujeira (Dirty Read): T1 pode ler um dado atualizado por uma transação T2 concorrente não confirmada. Se T2 abortar, então T1 lerá um valor que não existe e está incorreto.
- Leitura Não Repetível (Non-Repeatable Read): T1 relê um dado previamente lido e obtém um valor diferente da primeira leitura (o dado foi atualizado por outra transação).
- Leitura Fantasma (Phantom Read): T1 lê um conjunto de linhas de uma tabela. T2 insere uma nova linha na tabela. Se T1 for repetida, ela verá um fantasma, uma linha que não existia anteriormente.
Bloqueio de Dados (Locking)
- Um bloqueio é um mecanismo para controlar o acesso simultâneo a um item de dados.
- Os itens de dados podem ser bloqueados em dois modos:
- Modo Exclusivo (X): O item de dados pode ser lido e também escrito. O bloqueio X é solicitado pela instrução
lock-X
. - Modo Compartilhado (S): O item de dados só pode ser lido. O bloqueio S é solicitado pela instrução
lock-S
.
Granularidade do Bloqueio
A granularidade do bloqueio refere-se ao tamanho do item de dados que pode ser bloqueado:
- Linha (registro)
- Bloco (página)
- Tabela
- Banco de Dados
Observação: Quanto maior o tamanho do bloqueio, menor é o grau de concorrência permitido.
Protocolos de Bloqueio
Protocolo de bloqueio: É um conjunto de regras seguidas por todas as transações enquanto solicitam e liberam bloqueios. Os protocolos de bloqueio restringem o conjunto de schedules possíveis.
Armadilhas dos Protocolos de Bloqueio
Os protocolos baseados em bloqueio podem levar a:
- Impasse (DEADLOCK)
- Inanição (STARVATION)
Tratamento de Impasse (Deadlock)
- O sistema está em impasse se houver um conjunto de transações de modo que cada transação no conjunto esteja esperando por outra transação no conjunto.
- Protocolos de prevenção de impasse garantem que o sistema nunca entrará em um estado de impasse.
Algumas estratégias de prevenção incluem:
- Protocolos baseados em timestamp (estampas de tempo)
- Protocolos baseados em timeout