• Nenhum resultado encontrado

.

À medida que as transações solicitam leitura e gravações de ítens de dados do banco de dados, essas solicitações são repassadas a um escalonador. Na maioria das situações, o escalonador executará as leituras e gravações diretamente, primeiro chamando o gerenciador de buffers, se o item de dados desejado não estiver em um

buffer. A Figura 6.1 demonstra o papel do escalonador.

Figura 5.1 - O Papel do Escalonador.

Um escalonamento é uma seqüência ordenada no tempo das ações importantes executadas por uma ou mais transações. No controle de concorrência, as ações importantes de leitura e gravação têm lugar nos buffers da memória principal e não no disco (MOLINA et al , 2001).

O escalonamento deve examinar as condições sob as quais uma coleção de transações executadas de forma concorrente preservará a consistência do banco de dados.

Considerando a arquitetura mais comum para um escalonador, a que utiliza bloqueios sobre ítens de dados a fim de evitar um comportamento não serializável. O

73 controle de concorrência baseado em bloqueio, visa a sincronização das transações, assegurando que os dados compartilhados por operações conflitantes sejam acessados por uma operação de cada vez. Este acesso é assegurado pela associação de um “bloqueio” a cada unidade de bloqueio. Esse bloqueio é definido por uma transação antes de ser acessado e é redefinido no final e seu uso.

6.3.1 Controle de Concorrência Baseado em Bloqueio

Um escalonador que utiliza algoritmos de bloqueio, utiliza uma tabela de bloqueio para ajudá-lo a executar seu trabalho. Esta tabela de bloqueio informa, para todo o banco de dados, a transação que contém atualmente um bloqueio sobre esse item. Existem dois modos de bloqueio: modo compartilhado e modo exclusivo. No modo exclusivo, uma operação obtém o bloqueio de um item de dado que está associado a uma unidade de bloqueio. Este bloqueio permite acesso ao item de dados apenas pela transação que o bloqueou. Caso uma outra transação requisite o bloqueio desta unidade de bloqueio, terá que entrar na fila de espera e só obterá tal bloqueio no momento em que a primeira transação liberar a unidade de bloqueio. Normalmente o bloqueio exclusivo é utilizado por operações de gravação.

O modo compartilhado é utilizado para a operação de leitura, pois não afetará o estado do item de dado. No modo compartilhado, duas ou mais operações de leitura podem adquir o bloqueio sobre uma mesma unidade de bloqueio.

No caso de existir uma operação de leitura e uma de gravação, o bloqueio não poderá ser compartilhado.

A matriz de compatibilidade demonstra quais as operações que podem ser compatíveis quanto ao bloqueio de um mesmo item de dados, num mesmo instante de tempo (Tabela 3).

Tabela 3 - Matriz de Compatibilidade de bloqueios

Operações Bloqueio de Leitura Bloqueio de Gravação Bloqueio de Leitura Há compatibilidade Não há compatibilidade

5.3.1.1 Bloqueio em duas fases

Os algoritmos de controle de concorrência baseados no bloqueio em duas fases, executam transações em duas fases: fase de crescimento, em que a transação obtém o bloqueio e acessa o item de dados, e a fase de contração, na qual o bloqueio é liberado.

Obter Bloqueio

Liberar Bloqueio

Início Ponto de Fim

Bloqueio Duração da Transação N úm er o de B loquei os

Figura 5.2 - Gráfico de Bloqueio 2PL Fonte: ÖSZU & VALDURIEZ (2001)

O gerenciador de bloqueio libera o bloqueio logo que o acesso ao item de dados é concluído. Com esta liberação, outras transações que estão na fila de espera podem obter o acesso a este item de dado. Isso faz com que aumente o grau de concorrência.

5.3.2 Controle de Concorrência baseado em Pré-ordenação

Algoritmos baseados em timbre de hora selecionam a priori uma ordem de serialização e executam as transações de acordo com ela. Com isso, os algoritmos baseados em marca de tempo não tentam manter a serialização por exclusão mútua.

Segundo MOLINA et al (2001), para atribuir uma “marca de tempo” a cada transação, o gerenciador de transações atribui a cada transação Ti uma única marca de

tempo ts(Ti) no momento em que uma transação notifica ao escalonador que está se

75 - um modo de criar marca de tempo é usar o relógio do sistema, desde que o escalonador não opere tão rápido que possa atribuir marcas de tempo a duas transações em um único pulso do relógio;

- outro modo é o escalonador manter um contador. Toda vez que uma transação se inicia, o contador é incrementado por 1, e o novo valor se torna a marca de tempo da transação.

Independente do método usado para geração de marcas de tempo, o escalonador deve manter uma tabela de transações atualmente ativas e suas marcas de tempo.

Com este método, é preciso associar a cada elemento do banco de dados, duas marcas de tempo e um bit adicional:

a) RT (x), a hora de leitura de x, que é a marca de tempo mais alto de uma transação que leu x.

b) WT (x), a hora de gravação de x, que é a marca de tempo mais alto de uma transação que gravou x.

c) C (x), o bit de consolidação para x, que é verdadeiro se e somente se a transação mais recente a gravar x já foi consolidada.

Onde existe um escalonamento de 3 transações, T1, T2 e T3 que acessam a três

elementos do banco de dados A, B e C, é indicado as marcas de tempo das transações e a hora das leituras (R) e gravações (W) dos elementos. É suposto que, no início, cada um dos elementos do banco de dados tenha uma marca de leitura igual e de gravação igual a 0. As marcas de tempo são atribuídas quando as transações entram em contato com o escalonador e notificam que estão começando. No entanto, mesmo T1 sendo o

primeiro acesso não tem a marca de tempo menor. Possivelmente, T2 foi a primeira a

notificar o escalonador de seu início, e T3 fez o mesmo logo em seguida, com T1

notificando por último (MOLINA et al ,2001). Um exemplo de escalonamento por marcas de tempo é mostrado na Figura 5.3

T1 T2 T3 A B C 200 150 175 RT = 0 WT = 0 RT = 0 WT = 0 RT = 0 WT = 0 R1(B) RT = 200 R1(A) RT = 150 r3(C) RT = 175 w1 (B) WT = 200 w1 (A) WT = 200 W2(C) Abortar; W 3(A)

Figura 5.3 – Exemplo de Marcas de Tempo Fonte: MOLINA et al ,2001

T1 lê B. Considerando que a hora de gravação de B é menor que a marca de tempo

de T1, essa leitura é realizável e tem permissão para acontecer. A hora real de B é

definida como 200, a marca de tempo. As outras duas ações de leitura também são válidas e resultam na definição da hora de cada elemento do banco de dados como a marca de tempo da transação que fez a leitura.

Depois, T1 grava B. Como a hora de leitura de B é menor que a marca de tempo de

T1, a gravação é realizável. Quando é realizado, a hora de gravação de B é aumentada

para 200, a marca de tempo da transação T1 que fez gravação. Logo, T2 tenta gravar C.

Entretanto, C já foi lido pela T3 que, teoricamente, foi executada na hora 175, enquanto

T2 teria gravado seu valor na hora 150. Portanto, T2 resultaria num comportamento

fisicamente irrealizável, e T2 deve ser revertida.

Como última etapa há a gravação de A por T3. Como a hora de leitura de A, 150, é

menor que o timbre de hora de T3, 175, a gravação é válida. Porém, já existe um valor

posterior de A armazenado nesse elemento do banco de dados. Desse modo, T3 não é

77

Documentos relacionados