Sunday, December 28, 2008

Controle de concorrencia

Transação

Definição: Uma transacção é uma sequência de operações que faz transitar um sistema de informação de um estado coerente inicial (A) para um estado coerente final (B).

Este conceito é realizado com base nas seguintes primitivas:

  • Inicio: Que inicia a transacção e antecede a sequência de operações; fica assim definido o estado inicial A.
  • Fim: Que marca a terminação bem sucedida da transacção, marcando assim o estado final B do sistema; o sistema deve comprometer-se em manter este novo estado, que poderá ser acedido por futuras transacções; (commit).
  • Abortar: Que marca a anulação da transacção, em reacção a um dos incidentes imprevistos, obrigando o sistema a manter o estado inicial inalterado (A), como se a transacção nunca se tivesse iniciado. (rollback [implicito ou explicito]).

Transações devem obdecer as regras impostas pelo conceito ACID, o banco de dados deve garantir que os dados sejam consistentes e permanentemente gravados no DB.

Regras ACID

A sigla ACID se refere a propriedade de banco de dados relacionais, onde tais imposições são postas em cima de cada transação, todas as base relacionais Oracle funcionam em função dessas caracteristicas. Em banco de dados, um operação lógica é chamada de transação.

  • Atomicidade – Trabalho como indivisivel, atomico, ou tudo é realizado ou nada é executado, como analogia temos uma mulher que esta grávida ou não esta. Nada será debitado da sua conta se nada for créditado em outra. (comitt e rollback).
  • Consistencia – Garante que mesmo antes ou depois da transação ter finalizado os dados continuam consistentes. (constraints).
  • Isolamento – Trabalho em nivel individual, os mesmos dados não podem ser alterados simultaneamente, entretando, a qualquer consulta pode ser executada a qualquer momento. (locks).
  • Durabilidade – Deve se garantir que em caso de sucesso os dados referentes a transação sejam permanentemente inseridos. (redo log).

Mecanismo de controle de concorrencia

Devido ao fato das transações serem executadas concorrentemente uma as outras, é necessário um metodo de equacionar as transações, tais transações necessecitam um ordenamento coerente, há a necessidade de impor restrições nas ações que cada transacção realiza, assim surgi um escalonador, que resolve o problema quando duas transações tentam modificar simultaneamente um objecto em comum.

Em operações de leitura ou escrita, o escalonador é acionado, e ele é quem decidi se a operação é aceita, rejeita ou deve ser adiada.

Há duas grandes classes de escalonadores:

  • Pessimistas: Metodo baseado em locks ou estampilhas, assume que conflitos entre as transações são frequentes, e tendem a resolve-los rejeitando ou adiando operações.
  • Optimistas: Assume que os conflitos são poucos frequentes, em caso de conflito tende a anular e iniciar a operação desde o inicio. Este metodo permite a operação avançar sem lidar com conflitos, utiliza-se de espaço privados, e somente valida ao final, commit, não necessita lidar com deadlocks, há maior paralelismo, todavia pode ser custoso em caso excessivo de falhas, pois ao final em caso de conflito toda operação deve ser refeita.

Locks

Nos metodos baseados em locks, as relações de dependencias de transações seguem uma ordem cronologica, uma transação que cause um conflito é obrigada a aguardar até que o objeto seja liberado, este metodo tem que lidar com conflitos irreversiveis, deadlocks.

Existem diversos metodo de mecanismos de controle de concorrencia para escalonadores pessimistas, entre eles temos:

Travamento Bifasico ou Two-phase locking

Metodo baseado em locks, cada transação antes de ler um objeto precisa de um bloqueio S (compartilhado ou shared), e antes de escrever em um objeto precisa de um bloqueio X (exclusivo), depois de finalizado a transação não pode mais obter nenhum lock, enquanto houver lock X não pode haver nenhum lock S ou X.
Este mecanismo é utilizado no sql até a versão 2005.

Multiversion concurrency control (MCC), controle de concorrencia multi-versão.

Metodo prove a cada usuário conectado ao banco de dados uma fotografia, snapshot, de parte do banco de dados na qual ele esta trabalhando. Qualquer alteração feita por pelo mesmo não será vista pelo demais usuário do banco até que a mesma seja gravada permanentemente, commit.
MCC utiliza uma variavel de tempo ou um indentificador de transação para garantir a ordenação coerrente das multiplas transações simultaneas, tal mecanismo evita lock em operaçõs de select. Tal recurso se encontra disponivel no Oracle desde a versão 7, e obtido atraves de imagens armazenadas na tablespace de undo, a qual é uma imagem anterior da linha antes de ser alterada por uma operação.
Tal mecanismo é apenas encontrado no SQL Server a partir da versão 2005.

Durabilidade

Operações permanentemente gravadas (commits) ou não (em execução), são frequentemente gravadas em log, no Oracle chamamos de On-line redo logs, tais logs são arquivos binários gravados fisicamente em disco, informações são armazenadas nos arquivos de logs com mais frequencia que nos arquivos de dados dada a sua importancia para recuperação do ambiente, e pelo fato da escrita ser sequencial, ao contrário do arquivo de dados, que é indexada. Devido a sua importancia na recuperação de informações o arquivos de dados de ser multiplexado, isso significa que deve haver mais de um cópia do arquivo recente.
Dentro do arquivo de log há um encadeamento indetificado pelo numero de cada transação, assim é sabido por onde iniciar um recover.

Recovery

É feito em três fases, analise, redo e undo.
É analisado o log e o arquivo de controle, onde o numero de transação deve estar sincronizado em cada arquivo, caso não esteja há a necessidade de refazer as operações perdidas, redo, onde o arquivo de log é utilizado para refazer tais transações, após a operação de redo há a necessidade de undo, pois os arquivos de logs contém informações não commitadas, os valores consistentes para tais informações são encontrados na tablespace de undo do oracle, aplicando undo o banco de dados se torna consistente e integro.

Referencia:
http://en.wikipedia.org/wiki/ACID
http://en.wikipedia.org/wiki/Concurrency_control
http://www-asc.di.fct.unl.pt/~jcc/scpd-05-06/Teoricas/st1/node4.html
http://www-asc.di.fct.unl.pt/~jcc/scpd-05-06/Teoricas/st1/node16.html
http://www-asc.di.fct.unl.pt/~jcc/scpd-05-06/Teoricas/st1/node17.html
http://en.wikipedia.org/wiki/Multiversion_concurrency_control
http://www.ime.usp.br/~reverbel/BD-00/Slides/s08.pdf

No comments: