Controle de transações em bancos de dados

Figura 1: Controle de transações em bancos de dados

Qualquer banco de dados que seja utilizado por mais de um usuário, terá que administrar o controle de concorrência entre as informações que estão sendo acessadas pelos usuários. Controle de concorrência é quando, em um banco de dados, usuários distintos tentam acessar a mesma informação e então é feito um controle entre essas transações. E para a solução deste problema existem diversas técnicas de controle de concorrência que são utilizadas como forma de assegurar a propriedade de não interferência entre uma operação e outra, ou o isolamento das transações executadas ao mesmo tempo. Grande parte dessas técnicas garante a serialização, que é a execução das transações de forma serial. Para isso, é necessário saber que transações são todas as operações executadas entre o início e o fim da transação, e para gerenciar as transações é necessário conhecer as propriedades comumente chamadas de ACID (acrônimo de Atomicidade, Consistência, Isolamento e Durabilidade) que devem ser usadas pelos métodos de controle de concorrência e recuperação do SGBD:

  • A Atomicidade é o princípio de que uma transação é uma unidade de processamento atômica, ou seja, a transação deve ser realizada por completo ou ela não deve ser realizada de forma alguma. Caso haja alguma falha durante a transação, os efeitos parciais desta transação no banco devem ser desfeitos. Para que essa transação onde teve a falha seja desfeita, é necessário que o banco de dados emita o comando que desfaça tal transação, garantindo assim a integridade do banco.
  • A preservação da Consistência permite que uma transação seja executada desde o início até o fim sem que haja a interferência de outras transações durante sua execução, ou seja, é a execução de uma transação isolada, levando o banco de um estado consistente para outro.
  • O Isolamento garante que uma transação possa parecer isoladamente de outras transações, mesmo tendo várias transações sendo executadas simultaneamente, o sistema irá dar garantias de que, para cada conjunto de transações, uma transação seja encerrada antes do início da outra, ou seja, a execução de uma determinada transação não sofrerá a interferência de nenhuma outra transação que esteja acontecendo simultaneamente.
  • A Durabilidade (ou permanência) é a garantia de que as mudanças que ocorreram no banco de dados ao término de uma transação que foi finalizada com sucesso persistam no banco, ou seja, após uma operação com êxito ser encerrada, estes dados gravados devem consistir no banco de dados mesmo que ocorrem quaisquer tipos de falha no sistema.

A técnica de bloqueio em duas fases para controle de concorrência é baseado no bloqueio de itens de dados, sendo que, 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. Permitindo 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, são elas: 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 que pode ocorrer é o 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.

E por aqui eu finalizo este artigo, no qual vimos como ocorre o controle de concorrência usando a técnica de bloqueio em duas fases e quais são alguns dos possíveis problemas que podem ocorrer. Vejo você nos próximos artigos.

Até breve.

Um grande abraço.