Transação

Uma transação é uma sequência de operações executadas como uma única unidade lógica de trabalho que deve mostrar quatro propriedades, designadas pelas iniciais ACID (atomicidade, consistência, isolamento e durabilidade).

Atomicidade: Ou todas as operações da transação são executadas no banco de dados ou nenhuma será. Assegurar a atomicidade de uma transação é responsabilidade do SGBD, mais especificamente, do Componente de Gerenciamento de Transações e Recuperador de Falhas.

Consistência: Transação executada isoladamente deve preservar a consistência do banco de dados. Esta é responsabilidade do programador.

Isolamento: Modificações feitas por transações simultâneas devem ser isoladas das modificações feitas por qualquer outra transação simultânea. Uma transação reconhece os dados no estado em que estavam antes de outra transação simultânea tê-los modificado ou reconhece os dados depois que a segunda transação tiver sido concluída, mas não reconhece um estado intermediário. Isso é chamado serializabilidade porque resulta na capacidade de recarregar os dados iniciais e reexecutar uma série de transações de modo que os dados obtidos estejam no mesmo estado em que estavam depois que as transações originais foram executadas. Assegurar o isolamento é de responsabilidade do Controlador de Concorrência.

Durabilidade: Depois que uma transação tiver sido concluída, seus efeitos ficam permanentemente no sistema. As modificações persistem até mesmo no caso de uma queda do sistema. Assegurar a durabilidade é responsabilidade do componente do SGBD chamado de Recuperador de Falhas.


Escalonamento

Um escalonamento é uma lista de ações de um conjunto de transações. Representa uma sequência de execução que deve conservar a mesma ordem de execução das ações das transações presentes nele.

Escalonamento completo: O escalonamento insere, para todas as transações, as ações de abort ou commit.

Escalonamento serial: O escalonamento não intercala as ações de transações diferentes.

Escalonamento equivalente: Para qualquer estado da base de dados, o efeito de executar um primeiro escalonamento é idêntico ao efeito de executar um segundo escalonamento.

Escalonamento serializável: Escalonamento equivalente a alguma execução serial das transações.


Log de Transações

Podemos entender por logs de transação sendo este um arquivo no qual o SQL Server armazena um registro com todas as transações realizadas e dados que foram modificados no banco de dados com o qual o arquivo de log possa estar associado. Isso é bem necessário para que em casos que o SQL Server seja desligado inesperadamente, como uma falha da instância ou mesmo hardware, o log de transação é utilizado para recuperar o banco de dados, com a integridade dos dados.

Concorrência



  • Um Gerenciador de Banco de Dados compartilhando dados com várias aplicações estará sujeito ao acesso concorrente dos dados.
  • Quanto maior for o nível de concorrência permitido, melhor será o tempo de resposta do sistema como um todo.
  • O procedimento de paralelismo determina o mecanismos de controle de concorrência.
  • Técnica de bloqueio:
    • É feita em duas fases para que aconteça o controle de concorrência
    • Chamamos de bloqueio uma variável que fica atrelada ao item de dados.
    • Este bloqueio pode ser binário (possui dois valores: 1 e 0), logo, o item de dados está bloqueado ou não está bloqueado. Isto permite que o item de dado só esteja acessível para uma transação apenas se a variável não estiver bloqueada (ou estiver com valor 0).
    • São usadas duas operações para o bloqueio binário: lock(1) e unlock(0), quando o item de dados está sendo usado, o estado da variável é lock(1), assim que a transação encerra a utilização do item é emitida a operação unlock(0), então, o item já está disponível para outra transação.



  • Duas maneiras de bloquear(lock) os dados são:
    • Bloqueio Compartilhado:
      • Quando uma transação recebe este tipo de bloqueio e a instrução é de leitura, então, mais de uma transação poderá acessar o mesmo dado. Se a instrução for de gravação, então ela não poderá participar de um bloqueio compartilhado, ou seja, é permitido que várias transações acessem um mesmo item "A" se todas elas acessarem este item "A" apenas para fins de leitura.
    • Bloqueio Exclusivo:
      • Quando uma transação recebe este tipo de bloqueio, ela fica exclusivamente reservada para a instrução que compõe a transação, não permitindo que outra transação faça uso do dado que está sendo utilizado, logo, um item bloqueado para gravação é chamado de bloqueado exclusivo, pois uma única transação mantém o bloqueio no item.
  • Uma transação precisa manter o bloqueio do item de dado durante o tempo em que estiver acessando aquele item, até mesmo porque nem sempre o desbloqueio imediato após o acesso final é interessante, pois pode comprometer a serialização em alguns casos.


  • Sempre haverá a necessidade de bloqueio e desbloqueio dos itens de dados, mas existem algumas situações em que a combinação dessas duas fases pode gerar um problema no banco dados. Caso não seja feito o desbloqueio do item de dado antes da solicitação de um bloqueio a outro item de dado, pode ocorrer um deadlock (ou impasse).
    • Consideremos que existem duas transações A e B, a transação A está esperando por algum item que está bloqueado na transação B, e a transação B está esperando por algum item que está bloqueado em A, então, ambas ficam na fila de espera, aguardando que seja liberado o bloqueio de um item, como isso não ocorre, as duas transações acabam nunca conseguindo ser concluídas.



  • Outro problema - starverd (ou starvation):
    • Consideremos que existem três transações A, B e C, a transação A faz a requisição de um bloqueio compartilhado de um item de dado, logo em seguida a transação B faz uma requisição de bloqueio exclusivo do mesmo item de dado, como a transação A está usando o bloqueio compartilhado do item, logo a transação B não poderá deter o acesso, o que faz com que ela fique na fila de espera, até a liberação do mesmo.
    • Enquanto a transação B está na fila, chega a transação C com o pedido de compartilhamento do mesmo item, como é possível fazer o compartilhamento do item que A está usando, então, a transação C passa na frente de B e consegue o compartilhamento do item de dado da transação A.
    • Quando a transação A terminar de desocupar, o item de dado continuará ocupado pela transação C, enquanto isso, a transação B continuará aguardando a liberação total do item de dado para que ela possa fazer o bloqueio exclusivo. Caso as próximas transações sejam sempre de acesso compartilhado deste mesmo item, a transação B nunca conseguirá fazer um progresso, e então, ela é considerada estagnada.


Bancos Transacionais

• Oracle Database;

• Microsoft SQL Server;

• IBM DB2;

• Postgre SQL;

• Borland Interbase / Firebird;



Exemplos

  • Exemplo 1
    • Em um banco, a transação T1 transfere R$100,00 de uma conta A para uma conta B. A transação deverá seguir a seguinte ordem:
      • Primeiramente é feita uma leitura da conta A,
      • a retirada dos R$100,00,
      • e alteração (escrita) em A.
    • Em seguida, é feita a leitura da conta B,
      • o depósito (soma) dos R$100,00
    • para enfim alterar (escrever) a conta B.


  • Para que não haja inconsistência, somente após a conclusão e confirmação de que não houve erro em nenhuma das etapas, a transação será finalizada e poderá ser visualizada por outro usuário do banco de dados.
  • Caso ocorra algum erro, todas as etapas são anuladas e nenhuma é salva no banco de dados.


  • Exemplo 2:
    • Um banco de dados de uma universidade está sendo acessado pelos usuários X e Y ao mesmo tempo.
      • O usuário X está fazendo uma consulta dos nomes dos alunos em ordem alfabética, matriculados em cada curso.
      • O usuário Y está realizando a matrícula de dois novos alunos que acabaram de chegar à universidade.
    • Para garantir que não haja inconsistência nos dados consultados pelo usuário X,
      • a transação (cadastro) realizada pelo usuário Y só será finalizada e salva no SGBD quando Y completar todas as etapas exigidas durante o cadastramento.
    • Dessa forma, a consulta realizada por X deverá ser feita ANTES ou DEPOIS que Y finalizar o cadastramento.

Referências

<< http://www.ic.unicamp.br/~geovane/mo410-091/Ch16-GerTrans_pt.pdf >>, Acesso em 05/05/2015

<< http://www.inf.unioeste.br/~clodis/BDII/BDII_Modulo_1.pdf >>, Acesso em 05/05/2015

<< https://technet.microsoft.com/pt-br/library/ms190612(v=sql.105).aspx >>, Acesso em 05/05/2015

<< http://paginas.unisul.br/edson.thizon/PDF/apostila_bd2.pdf >>, Acesso em 06/05/2015

<< http://www.wiki.ifba.edu.br/ads/tiki-download_file.php?fileId=425 >>, Acesso em 06/05/2015