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. Protocolos baseados em locks (cont.) Matriz de compatibilidade de locks: C E C Verdadeiro Falso E Falso Falso Pode ser concedido um lock de um dado a uma transação se o lock solicitado é compatível com locks adquiridos por outras transações para o mesmo dado. Se o lock não pode ser concedido, a transação que requer o lock é suspensa até que todos os outros locks incompatíveis sejam liberados pelas outras transações. Protocolos baseados em locks (cont.) Exemplo de transação com locks: T1 lock-C (A) read (A) unlock(A); lock-C (B) read (B) unlock (B) display (A+B) Escalonamento que não preserva a Soma (A+B) T7 T8 lock-X (B) read (B) B := B – 50 write (B) unlock (B) lock-S (A) read (A) unlock (A) lock-S (B) read (B) unlock (B) display (A + B) lock-X (A) read (A) A :=A + 50 write (A) unlock (A) Protocolos baseados em locks (cont.) Locks usados como o exemplo anterior não garantem seriação: se A e B forem utilizados entre as leituras de A e B, a soma mostrada estaria errada Protocolos baseados em locks (cont.) Um protocolo para locks é um conjunto de regras que todas as transações devem seguir para requisitar e devolver locks. Os protocolos restringem o conjunto de escalonamento possíveis. Problemas que devem ser contornados: Deadlock Falta de garantia de progresso (starvation, liveleness) 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. Protocolo de lock em duas fases (cont.) O protocolo garante seriação O protocolo não garante inexistência de deadlocks Protocolo de duas fases estrito – Transação deve manter locks exclusivos até compromissar Protocolo de duas fases rigoroso – Todos os locks devem ser mantidos. Transações podem ser seriadas na ordem em que são compromissadas Conversão de locks Protocolo de lock em duas dases com conversão: Fase 1: Pode requisitar lockCp sobre dado. Pode requisitar lockEx sobre dado. Pode converter lockCp em lockEx. Fase 2: Pode liberar lock-Cp. Pode liberar lock-Ex. Pode converter lockEx em lockCp Implementação de Isolamento Escalonamento devem ser seriáveis e recuperáveis (para manter consistência). Esquema que permite que apenas uma transação execute por vez gera escalonamentos seriais, mas é extremamente ineficiente. Esquemas de controle de concorrência são um compromisso entre grau de concorrência permitido e custo de execução (overhead). Níveis de Isolamento em SQL Server Uncomitted Read – permite que a transação leia todos os dados que estiverem atualmente em uma página de dados, efetivados ou não. Esta opção abandona as garantias de ter dados fortemente coerentes para que possa ter a vantagem de uma alta concorrência no sistema Indicado para certas na análises de apoio à decisão set transaction isolation level uncommitted read Níveis de Isolamento em SQL Server Commited Read – apenas registros compromissados podem ser lidos, mas leituras repetidas podem retornar valores diferentes. Os bloqueios de compartilhamento podem ser liberados depois que os dados tiverem sidos enviados para o cliente que fez a chamada Nível de isolamento padrão do SQL Server set transaction isolation level committed read Níveis de Isolamento em SQL Server Repeatable Read - apenas registros compromissados podem ser lidos, leituras repetidas devem retornar mesmo valor. Executar a mesma consulta duas vezes dentro de uma transação não pegará quaisquer alterações realizadas nos valores dos dados pela transação de outro usuário Todos os bloqueios compartilhados devem ser mantidos até o final da transação set transaction isolation level committed read Níveis de Isolamento em SQL Server Serializable – aumenta as propriedades de Repeatable Read Todos os bloqueios compartilhados devem ser mantidos até o final da transação Utiliza bloqueio de intervalo de índices para que as leituras retornem sempre os mesmos resultados Este nível recebe este nome pelo fato de que executar várias transações que podem ser colocadas em série simultaneamente é equivalente a executá-las uma por vez, em qualquer ordem set transaction isolation level serealizable