CONTROLE DE CONCORRÊNCIA Lílian Simão Oliveira O que é uma transação? É qualquer ação que lê ou grava em um banco de dados Um banco de dados em estado consistente é aquele em que são satisfeitas as restrições de integridade de todos os dados. Propriedades de uma transação: Indivisibilidade – exige que todas as operações (solicitações do SQL) de uma transação estejam concluídas. Caso contrário, a transação é abortada. Se uma transação T1 tiver quatro solicitações de SQL, todas devem ser concluídas com sucesso, senão a transação inteira é abortada. Em outras palavras, uma transação é abordada como uma única e indivisível unidade lógica de trabalho. Propriedades de uma transação: Consistência – indica a permanência do estado consistente do BD. A transação leva o banco de dados de um estado consistente a outro. Quando concluída, o banco deve estar em estado consistente. Se qualquer parte da transação violar uma restrição de integridade, toda transação é abortada. Propriedades de uma transação: Isolamento – significa que todos os dados utilizados durante a execução de uma transação não podem ser utilizados por uma segunda transação até que a primeira seja concluída. Em outras palavras, se uma transação T1 estiver sendo executada e utilizar o item de dado X, esse item não pode ser acessado por nenhuma outra transação até que o T1 termine. Essa propriendade é especialmente útil em ambientes de multiusuário, pois vários usuários podem acessar e atualizar o banco simultaneamente. Propriedades de uma transação: Durabilidade – garante que, uma vez feitas (consolidadas) alterações pelas transações, elas não podem ser desfeitas ou perdidas, mesmo em caso de falhas de sistema. Propriedades de uma transação: Ser serializável – garante que o escalonador da execução atual das transações produza resultados consistentes. Essa propriendade é importante em BD distribuídos e de multiusuário, em que várias transações provavelmente serão executadas de modo simultâneo. Naturalmente, se apenas uma transação for executada, a serialização não é problema. Gerenciamento de transações com SQL O suporte a transações é fornecido por dois comandos de SQL: COMMIT e ROLLBACK Chegar a um COMMIT, caso em que todas as alterações são registradas de maneira permanentemente no banco de dados. Esse comando encerra automaticamente a transação de SQL. Gerenciamento de transações com SQL Chegar a um ROLLBACK, caso em que todas as alterações são abordadas e o banco de dados retorna ao seu estado consistênte anterior. Chegar com sucesso ao fim do programa, caso em que todas as alterações são registradas de maneira permanente no BD. Essa ação equivale a COMMIT. Gerenciamento de transações com SQL O programa seja encerrado de modo anormal, caso em que todas as alterações feitas no BD são abordadas e retorne a seu estado consistente anterior. Essa ação equivale ao ROLLBACK Log de transação Armazena todas as transações efetuadas no BD. As informações armazenadas nesse log são utilizadas para uma solicitação de recuperação acionada pelo comando ROLLBACK. Log de transação Esse log armazena: Um registro de início de transação Para cada componente de transação Tipo de operação executada (atualização, exclusão, inserção) Nomes dos objetos afetados pela transação (nome da tabela) Valores “antes” e “depois” nos campos sendo atualizados Ponteiros para as entradas anteriores e posteriores da mesma transação no log O fim (COMMIT) da transação Controle de Concorrência É a coordenação de execuções simultâneas de transações em um BD multiusuário O objetivo: garantir a serialização das transações nesse tipo de ambiente Os principais problemas são: atualizações perdidas, dados não consolidados e recuperações inconsistentes Atualizações perdidas Ocorre quando 2 transações concorrentes T1 e T2, estão atualizando o mesmo elemento de dados e uma das atualizações é perdida (sobrescrita por outra aplicação). Dados não consolidados Ocorre quando duas transações, T1 e T2, são executadas de modo concorrente e a primeira (T1) é desfeita após a segunda (T2) ter acessado os dados não consolidados, violando assim a propriedade de isolamento de transações. Recuperação inconsistentes Ocorre quando uma transação acessa dados antes e após outras transações terminarem de trabalhar com esses dados. Por exemplo, esse problema ocorreria se a transação T1 calcular uma função de sumarização (agregada) de um conjunto de dados, enquanto outra transação (T2) estiver atualizando os mesmo dados. O problema é que a transação pode ler alguns dados antes de serem alterados e outros após a alteração, produzindo assim, resultados inconsistentes. Execução concorrente É permitido que múltiplas transações sejam executadas concorrentemente. Vantagens: - Melhor utilização de processador e discos, levando a um melhor desempenho do sistema. - Redução do tempo médio de resposta para transações: transações curtas não precisam esperar pela execução de transações longas. É necessário um esquema de controle de concorrência Escalonador É um processo especial do SGBD que estabelece a ordem em que são executadas as operações de transações concorrentes. O escalonador intercala a execução de operações e bd, garantindo a serialização e o isolamento das transações. Exemplo de escalonamento serial (Esc 1) To T1 read (A) A := A – 50 write (A) read (B) B := B + 50 write (B) read (A) temp :=A * 0.1 A := A – temp write (A) read (B) B := B + temp write (B) Escalonameto não serial equivalente a Esc. 1 To T1 read (A) A := A – 50 write (A) Read (A) temp :=A * 0.1 A := A – temp write (A) read (B) B := B + 50 write (B) read (B) B := B + temp write (B) Escalonamento que não preserva soma A+B To T1 read (A) A := A – 50 read (A) temp :=A * 0.1 A := A – temp write (A) read (B) write (A) read (B) B := B + 50 write (B) B := B + temp write (B) Seriação Premissa: cada transação preserva consistência do banco de dados – então execução serial de transações preserva consistência. Um escalonamento (possivelmente concorrente) é seriável se é equivalente a algum escalonamento serial. Noções diferentes de equivalência de escalonamentos: - Seriação por conflito (mais usada) - Seriação por visão, por valor, etc. Consideramos apenas operações read e write. Seriação por conflito Operações Oi e Oj de transações Ti e Tj, respectivamente, conflitam se e somente se existe algum dado D acessado por Oi e por Oj, e ao menos uma destas operações escreveu D. Intuitivamente, um conflito entre operações Oi e Oj força uma ordem (lógica) temporal entre elas. Se Oi e Oj são consecutivas em um escalonamento e não conflitam, seus resultados permaneceriam os mesmos, mesmo que fossem intercambiadas no escalonamento. Seriação por conflito (cont.) 1. Oi é read (D) e Oj é read (D). Oi e Oj não conflitam. 2. Oi é read (D) e Oj é write (D). Oi e Oj conflitam. 3. Oi é write (D) e Oj é read (D). Oi e Oj conflitam. 4. Oi é write (D) e Oj é write (D). Oi e Oj conflitam Seriação por conflito (cont.) Se um escalonamento E pode ser transformado em um escalonamento E’ através da troca de operações não conflitantes, dizemos que E e E’ são equivalentes por conflito. Um escalonamento E é seriável por conflito se E é equivalente por conflito a um escalonamento serial. Exemplo de escalonamento que não é seriável por conflito: T3 T4 read (D) write (D) write (D) Seriação por conflito - Escalonamento Esc. 3 pode ser transformado no escalonamento serial Esc. 1; Esc 3 é portanto seriável por conflito Esc. 3 To Esc. 1 T1 read (A) write (A) read (A) write (A) read (A) write (A) read (B) write (B) read (B) write (B) read (B) write(B) read (A) write (A) read (B) write(B) Protocolos baseados em locks Um lock (bloqueio) é um mecanismo para controle de acessos concorrentes a um mesmo item de dados. Dados podem ser bloqueados em dois modos: - Exclusivo (E). Dado pode ser escrito ou lido. - Compartilhado ( C). Dado pode ser apenas lido . Requisições de locks (lock-E ou lock-C) são feitas ao gerente de controle de concorrência. Transação fica suspensa até que lock seja concedido. Deadlock Considere o escalonamento parcial T3 lockEx (B) read(B) B = B – 50 write(B) T4 lockCp (A) read (A) lockCp (B) lockEx (A) Nem T3 nem T4 podem prosseguir. Esta situação é chamada de deadlock. Para tratar o deadlock é necessário desfazer T3 ou T4 (rollback), liberando os locks adquiridos. Protocolo de lock em duas fases Garante escalonamento seriável por conflito. Fase 1: Crescimento Transação pode requisitar novos locks. Transação não pode liberar locks. Fase 2: Encolhimento Transação pode liberar locks. Transação não pode requisitar novos locks.