Controle de concorrência de banco de dados
Controle de concorrência
Um SGBD trabalha individualmente com uma transação muito bem, mas o grande desafio para a sua consagração no mercado é sem dúvida a sua capacidade de tratar diversas transações simultaneamente.
Hoje em dia é muito comum e fácil o acesso a computadores com vários processadores ou então com processadores com vários núcleos, a esta característica chamamos de multiprocessador.
Existe também o multiprocessamento, que é a capacidade do sistema operacional executar mais de um programa ao mesmo tempo.
Isto pode ocorrer com um computador com um único processador, neste caso o processador acaba realizando o processamento em paralelo de diversos programas ao simultaneamente.
Se colocarmos mais processadores, ele vai distribuir as tarefas passando rotinas de processamento para cada processador, de modo independente.
E se apenas um programa estiver sendo executado, apenas um processador é utilizado, os demais ficam ociosos.
Mas existem sistemas operacionais mais inteligentes, que aproveitam a capacidade de multiprocessadores dos computadores e realizam uma melhor distribuição de carga de processamento.
Se apenas um programa estiver executando no servidor, o sistema operacional divide as tarefas deste programa entre os diversos processadores do servidor, otimizando assim a carga sobre um único processador e distribuindo entre os vários processadores, acelerando em muito a conclusão do processo.
Este tipo de sistema operacional é conhecido como multiprocessamento simétrico ou SMP, onde é realizado o balanceamento de carga.
O SGBD trabalha em conjunto com o sistema operacional para retirar a melhor performance possível na execução de transações concorrentes, garantindo inclusive a efetiva consistência de todas as transações envolvidas.
Um bom SGBD deve suportar e transacionar desde poucas transações ao mesmo tempo até dezenas e centenas de transações simultaneamente.
A sua capacidade de resolver os problemas que possam ocorrer durante as transações e a integridade que o mesmo garante, fazem com que o SGBD seja confiável.
Escalonamento (schedules)
Quando diversas transações são executadas concorrentemente, a consistência do banco de dados pode ser destruída apesar de cada transação individual estar correta.
Podemos afirmar que o escalonamento representa a ordem cronológica da execução de cada instrução no banco de dados.
Uma transação de um programa deve sair de um estado consistente e levar o banco de dados para outro estado consistente também.
Surge então o conceito de seriabilidade, ou seja, o escalonamento das execuções.
Escalonamento serial
Um escalonamento serial consiste de uma seqüência de instruções de várias transações na qual as instruções pertencentes a uma única transação aparecem juntas naquele escalonamento.
A ordem das transações afeta diretamente o resultado final.
Escalonamento não serial
Um escalonamento não serial consiste de uma seqüência de instruções de várias transações intercaladas entre si, o que pode provocar temporariamente um estado inconsistente.
Podemos concluir que o escalonamento não serial pode comprometer a consistência do banco de dados e causar transtornos enormes.
Por uma questão óbvia o escalonamento não serial não é permitido nos SGBDs comerciais mais famosos.
Protocolo baseado em bloqueios
Um modo de assegurar a seriabilidade é requerer que o acesso aos itens de dados seja feito de uma maneira mutuamente exclusiva, isto é, enquanto uma transação faz o acesso a um item de dado, nenhuma outra transação pode modificar aquele item.
O método mais fácil de garantir isto, é fazer com que uma transação ao acessar um dado, mantenha um bloqueio neste dado até o término da sua transação.
Formas de bloqueio
Bloqueio partilhado – se uma transação T obteve um bloqueio (lock) no modo partilhado (representado por P) no item de dado A, então T pode ler este item A mas não pode gravar A.
Bloqueio exclusivo – se uma transação T obteve um bloqueio (lock) no modo exclusivo (representado por X) no item de dado A, então T pode ler este item A e somente T poderá gravar A.
Bloqueio de duas fases – nesta forma de bloqueio, o protocolo divide-se em:
- Fase de crescimento – uma transação pode obter bloqueios, mas não pode liberar nenhum dos bloqueios feitos.
- Fase de encolhimento – uma transação libera um dos bloqueios, mas não pode obter nenhum outro bloqueio até concluir a transação atual.
Inicialmente, uma transação está na fase de crescimento, obtendo quanto bloqueios forem necessários para a sua transação. Uma vez que libere um bloqueio, a transação entrará na fase de encolhimento e não pode mais bloquear nenhum outro dado, até que a transação atual termine. Só então ela poderá começar outra transação com novos bloqueios.
Bloqueio baseado em grafos – nesta técnica, o modelo mais simples requer que tenhamos o conhecimento anterior da ordem na qual os itens do banco de dados serão utilizados, a única instrução permitida é o lock-x (modo exclusivo).
Os bloqueios são realizados utilizando a árvore de acesso aos dados. Muitos dados desnecessários são bloqueados e pode comprometer outras transações.
É um protocolo livre de deadlock, porém bloqueia muitos dados desnecessários para a transação.
Bloqueio baseado em marcador de tempo – o método mais comum para fazer isso é utilizar o esquema de ordenação por marcadores de tempo, criando duas variáveis w-timestamp(A) e r-timestamp (A).
Estas variáveis contêm os marcadores de tempo lógico do sistema para identificar nas transações quem chegou primeiro e quem chegou depois no dado.
Os marcadores de tempo são atualizados toda vez que uma instrução read ou write for executada.
Nenhum comentário:
Postar um comentário