DBMS - Controle de Concorrência
Em um ambiente de multiprogramação onde várias transações podem ser executadas simultaneamente, é altamente importante controlar a simultaneidade das transações. Temos protocolos de controle de simultaneidade para garantir atomicidade, isolamento e serializabilidade de transações simultâneas. Os protocolos de controle de simultaneidade podem ser amplamente divididos em duas categorias -
- Protocolos baseados em bloqueio
- Protocolos baseados em carimbo de data / hora
Protocolos baseados em bloqueio
Os sistemas de banco de dados equipados com protocolos baseados em bloqueio usam um mecanismo pelo qual nenhuma transação pode ler ou gravar dados até adquirir um bloqueio apropriado. As fechaduras são de dois tipos -
Binary Locks- Um bloqueio em um item de dados pode estar em dois estados; ele está bloqueado ou desbloqueado.
Shared/exclusive- Este tipo de mecanismo de bloqueio diferencia os bloqueios com base em seus usos. Se um bloqueio é adquirido em um item de dados para realizar uma operação de gravação, é um bloqueio exclusivo. Permitir que mais de uma transação gravasse no mesmo item de dados levaria o banco de dados a um estado inconsistente. Os bloqueios de leitura são compartilhados porque nenhum valor de dados está sendo alterado.
Existem quatro tipos de protocolos de bloqueio disponíveis -
Protocolo de bloqueio simplista
Os protocolos simplistas baseados em bloqueio permitem que as transações obtenham um bloqueio em cada objeto antes que uma operação de 'gravação' seja realizada. As transações podem desbloquear o item de dados após a conclusão da operação de 'gravação'.
Protocolo de bloqueio de pré-reivindicação
Os protocolos de pré-reivindicação avaliam suas operações e criam uma lista de itens de dados nos quais eles precisam de bloqueios. Antes de iniciar uma execução, a transação solicita ao sistema todos os bloqueios de que necessita previamente. Se todos os bloqueios forem concedidos, a transação executa e libera todos os bloqueios quando todas as suas operações terminam. Se todos os bloqueios não forem concedidos, a transação reverte e espera até que todos os bloqueios sejam concedidos.
Bloqueio de duas fases 2PL
Este protocolo de bloqueio divide a fase de execução de uma transação em três partes. Na primeira parte, quando a transação começa a ser executada, ela busca permissão para os bloqueios de que necessita. A segunda parte é onde a transação adquire todos os bloqueios. Assim que a transação libera seu primeiro bloqueio, a terceira fase é iniciada. Nesta fase, a transação não pode exigir nenhum novo bloqueio; ele apenas libera os bloqueios adquiridos.
O bloqueio de duas fases tem duas fases, uma é growing, onde todos os bloqueios estão sendo adquiridos pela transação; e a segunda fase está encolhendo, onde os bloqueios mantidos pela transação estão sendo liberados.
Para reivindicar um bloqueio exclusivo (gravação), uma transação deve primeiro adquirir um bloqueio compartilhado (leitura) e depois atualizá-lo para um bloqueio exclusivo.
Bloqueio estrito de duas fases
A primeira fase do Strict-2PL é igual a 2PL. Depois de adquirir todos os bloqueios na primeira fase, a transação continua a ser executada normalmente. Mas, ao contrário do 2PL, o Strict-2PL não libera um bloqueio após o uso. Strict-2PL mantém todos os bloqueios até o ponto de confirmação e libera todos os bloqueios de uma vez.
Strict-2PL não tem interrupção em cascata como 2PL.
Protocolos baseados em timestamp
O protocolo de simultaneidade mais comumente usado é o protocolo baseado em carimbo de data / hora. Este protocolo usa a hora do sistema ou contador lógico como um carimbo de data / hora.
Os protocolos baseados em bloqueio gerenciam a ordem entre os pares conflitantes entre as transações no momento da execução, enquanto os protocolos baseados em carimbo de data / hora começam a funcionar assim que uma transação é criada.
Cada transação possui um carimbo de data / hora associado a ela e a ordem é determinada pela idade da transação. Uma transação criada no horário 0002 seria mais antiga do que todas as outras transações posteriores. Por exemplo, qualquer transação 'y' entrando no sistema em 0004 é dois segundos mais nova e a prioridade seria dada à mais antiga.
Além disso, cada item de dados recebe o último registro de data e hora de leitura e gravação. Isso permite que o sistema saiba quando a última operação de 'leitura e gravação' foi realizada no item de dados.
Protocolo de pedido de carimbo de data / hora
O protocolo de ordem de carimbo de data / hora garante a serialização entre as transações em suas operações conflitantes de leitura e gravação. É responsabilidade do sistema de protocolo que o par de tarefas em conflito seja executado de acordo com os valores de carimbo de data / hora das transações.
- O carimbo de data / hora da transação T i é denotado como TS (T i ).
- O registro de data e hora de leitura do item de dados X é denotado por registro de data e hora R (X).
- O registro de data e hora do item de dados X é denotado por registro de data e hora W (X).
O protocolo de ordem de carimbo de data / hora funciona da seguinte maneira -
If a transaction Ti issues a read(X) operation −
- Se TS (Ti) <W-timestamp (X)
- Operação rejeitada.
- Se TS (Ti)> = W-timestamp (X)
- Operação executada.
- Todos os carimbos de data / hora de itens de dados atualizados.
If a transaction Ti issues a write(X) operation −
- Se TS (Ti) <carimbo de data / hora R (X)
- Operação rejeitada.
- Se TS (Ti) <W-timestamp (X)
- Operação rejeitada e Ti revertido.
- Caso contrário, operação executada.
Regra de escrita de Thomas
Essa regra determina se TS (Ti) <carimbo de data / hora W (X), a operação é rejeitada e T i é revertido.
As regras de pedido de registro de data e hora podem ser modificadas para tornar a exibição da programação serializável.
Em vez de fazer o rollback do T i , a própria operação de 'gravação' é ignorada.