Controle de concorrência entre transações em bancos de dados

Veja neste artigo o controle de concorrência entre transações em bancos de dados usando técnica de bloqueio em duas fases.


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 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:

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.

Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados