Prévia do material em texto
Banco de Dados 2 10/03 Bruno Glanzmann Vitor Belloni 22.1) Protocolo de bloqueio em duas fases é quando uma transação segue todas as operações de bloqueio, read_lock e write_lock, que precedem a primeira operação de desbloqueio na transação. A serialização é garantida se cada transação em um schedule seguir o protocolo de bloqueio em duas fases, além disso, o protocolo de bloqueio, ao impor as regras de bloqueio em duas fases, também impõe a serialização. 22.2) Existem 4 variações de bloqueios em duas fases: básico, conservador, estrito e rigoroso. O estrito e o rigoroso geralmente são os preferidos, pois são as duas variações que garantem schedules estritos, em que uma transação T não libera nenhum de seus bloqueios até que haja uma confirmação ou aborto. 22.3) O deadlock ocorre quando cada transação T em um conjunto de duas ou mais transações está esperando por algum item que está bloqueado por alguma outra transação, assim, criando uma fila de espera. Este problema pode ser lidado através de alguns métodos, como o protocolo de prevenção de deadlock, que requer que cada transação bloqueie todos os itens que precisar com antecedência, ou o detecção de deadlock, em que o sistema verifica se um estado de deadlock realmente existe ou o método de timeouts, onde caso uma transação espere por um tempo maior que o período limite, o sistema pressupõe que a transação pode entrar em deadlock e a aborta. Já a inanição, acontece quando uma transação não pode prosseguir por um período indefinido enquanto outras transações continuam normalmente, e a solução é usar um esquema de fila, onde a primeira transação que chegar será a primeira a ser atendida. 22.4) Um bloqueio binário pode ter dois estados ou valores: bloqueado e desbloqueado ou 1 e 0. Um bloqueio distinto é associado a cada item do banco de dados X. Se o valor do bloqueio em X for 1, o item X não pode ser acessado por uma operação de banco de dados que requisita o item. Se o valor de bloqueio em X for 0, o item pode ser acessado quando requisitado, e o valor do bloqueio é mudado para 1. No bloqueio exlcusivo/compartilhado, existem três operações de bloqueio: read_lock(X), write_lock(X), unlock(X). Um bloqueio associado item X, lock(X), agora tem três estados possíveis: bloqueado para leitura, bloqueado para gravação ou desbloqueado. Um item bloqueado para leitura também é chamado de bloqueado para compartilhamento, pois outras transações podem ler o item, enquanto um item bloqueado para gravação é chamado bloqueio exclusivo, visto que uma única transação mantém exclusivamente o bloqueio no item. Esse método é preferível, pois o bloqueio binário é muito restritivo para itens de banco de dados porque, no máximo, uma transação pode manter um bloqueio em determinado item. 22.5) No protocolo esperar-morrer, uma transação mais antiga tem permissão para esperar por uma transação mais nova, enquanto uma transação mais nova que solicita um item mantido por uma transação mais antiga é abortada e reiniciada. Já a técnica esperar-ferir faz o contrário, uma transação mais nova tem permissão para esperar por uma mais antiga, enquanto uma transação mais antiga que solicita um item mantido por uma transação mais nova apodera-se da transação mais nova ao abortá-la. 22.6) O protocolo de espera cuidadosa foi proposto para tentar reduzir o número de abortos/reinícios desenecessários através da seguinte regra: Se Tj não estiver bloqueada, então Ti está bloqueada e tem permissão para esperar, caso contrário, aborta Ti. No protocolo sem espera, se uma transação for incapaz de obter um bloqueio, ela é imediatamente abortada e, depois reiniciada após certo atraso de tempo sem verificar se um deadlock realmente ocorrerá ou não. Nesse caso, nenhuma transação espera, de modo que nenhum deadlock ocorrerá. No método de timeout, se uma transação esperar por um período maior que o período de timeout definido pelo sistema, o sistema pressupõe que a transação pode entrar em deadlock e a aborta independentemente de um deadlock realmente existir ou não. 22.7) Rótulo de tempo é um identificador exclusivo criado pelo SGBD para identificar uma transação. Eles podem ser gerados de várias maneiras, uma possiblidade é utilizar um contador que é incrementado toda vez que seu valor é atribuído a uma transação, outra maneira é usar o valor atual de data/hora do clock do sistema e garantir que dois valores de rótulo de tempo quaisquer sejam gerados durante a mesma batida do clock. 22.8) A ideia deste protocolo é ordenar as transações com base em seus rótulos de tempo, em que um schedule que as transações participam é então serializável, e o único schedule serial equivalente permitido tem as transações na ordem de seus valores de rótulo de tempo. A ordenação de rótulo de tempo estrita é uma variação da TO básica e a diferença entre eles é que a estrita garante que os schedules sejam tanto estritos quanto serializáveis. 22.10) É um tipo de bloqueio que não é compatível com os bloqueios de leitura, de modo que a transação pode ter que esperar sua confirmação até que todos os itens bloqueados para a gravação sejam liberados por quaisquer transações de leitura, a fim de obter os bloqueios de certificação. Quando eles são adquiridos, a versão confirmada X do item de dados é definida como o valor da versão X', a versão X' é descartada e os bloqueios de certificação são então liberados. A vantagem é que esse esquema evita a propagação de abortos, pois as transações só têm permissão para ler a versão X que foi gravada por uma transação confirmada. Porém a desvantagem é que podem ocorrer deadlocks se o upgrading de um bloqueio de leitura para um bloqueio de gravação for permitido. 22.11) Eles diferem no sentido de que neste técnica, nenhuma verificação é feita enquanto a transação está executando. Também são chamadas de técnica de validação, pois ao final da execução de toda transação existe a fase de validação para verificar se houve alguma violação na atualização da transação. Existem três fases, a de leitura, onde uma transação pode ler valores do itens de dados confirmados com base no banco de dados. A fase de validação, onde acontece a verificação para garantir que a serialização não será violada. E por fim a de gravação, onde as atualizações são aplicadas ao banco de dados. 22.12) Afeta diretamente pelo seu tamanho, pois quanto maior o tamanho do item de dados, menor será o grau de concorrência exigido. O fator que afeta a seleção do tamanho de granularidade é o tipo de transação envolvida no processo. 22.13) Bloqueio de granularidade múltipla 22.14) O protocolo de bloqueio de granularidade múltipla é usado para garantir a serialização através dos modos de bloqueio de intenção. E é usado especialmente quando se processa uma mistura de transações que inclui transações curtas que acessam apenas alguns itens e transações longas que acessam arquivos inteiros. 22.15) São bloqueios usados para tornar o bloqueio de granularidade múltipla prático. A ideia desse tipo de bloqueio é que uma transação indique, junto com o caminho da raiz até o nó desejado, que tipo de bloqueio ela exigirá de um dos descendentes do nó. 22.16) Os latches são usados quando há a necessidade de garantir a integridade física de uma página quando ela está sendo gravada do buffer para o disco. 22.17) É um tipo de registro que apareceu de repente no banco de dados ao ser inserido. O problema que ele causa é que pode acabar bloqueando todos os registros do banco de dados antes que T tenha inserido um novo registro. 22.18) Através do bloqueio de índice, se a entrada do índice for bloqueada antes que o próprio registro possa ser acessado, então o conflito no registro fantasma pode ser detectado, pois a transação T' solicitaria um bloqueio de leitura na entrada de índice paraa Dnr=5, e T solicitaria um bloqueio de gravação na mesma entrada antes que elas pudessem colocar os bloqueios nos registros atuais. Como os bloqueios de índice estão em conflito, o conflito fantasma seria detectado. 22.19) É uma técnica mais geral que bloqueia o acesso a todos os registros que satisfazem um predicado, ou seja, uma condição qualquer de uma maneira semelhante, porém, os bloqueios de predicado provaram ser difíceis de implementar de modo eficiente. 22.20) O grafo serializável precisa ser acíclico para garantir a serialização de conflitos dos schedules. Deve-se levar em consideração as fases de expansão e as fases de encolhimento, na fase de expansão ele obtém bloqueios mas não libera nenhum, já na fase de encolhimento acaba ocorrendo o contrário. 22.22) O bloqueio estrito em duas fases ocorre caso todas as operações de bloqueio (read lock, write lock) precedem a primeira operação de desbloqueio na transação. O bloqueio estrito em duas fases garante schedules estritos pois, para seguir o protocolo de duas fases as operações write lock e unlock não ocorrem de maneira seguida na mesma tornando impossível a reescrita das transações tornando os schedules estritos. 22.23) Esperar-morrer: Se uma transação solicitar um recurso que está bloqueado por outra transação, o SGBD simplesmente verifica o registro de data e hora de ambas as transações e permite que a transação mais antiga aguarde até que o recurso esteja disponível para execução. Suponha que existam duas transações T1 e T2, e seja o timestamp de qualquer transação T TS (T). Agora, se houver um bloqueio em T2 por alguma outra transação e T1 estiver solicitando recursos mantidos por T2, o DBMS executará as seguintes ações: Verifica se TS (T1)