Bases de Dados Transacções Propriedades ACID 1 T Atomicidade i : read(a) 2 A := A 50 se a transação falhar entre os 3 write(a) passos 4 6, os passos 1 3 ficam sem efeito 4 read(b) Consistência 5 B := B + 50 a soma A+B tem que ser igual 6 write(b) antes e depois Isolamento nenhuma outra operação deve ler os valores de A ou B entre os passos 3 e 6 Durabilidade assim que o passo 6 termina, todos os resultados são permanentes 2 1
Transacções e concorrência A forma mais fácil de garantir que 2 transacções não interferem seria executá-las em série mas assim o sistema opera à velocidade do componente mais lento (disco) faz com que pequenas transacções tenham que esperar pela conclusão de transacções mais demoradas 3 Transacções e concorrência Os SGBDs permitem que múltiplas transacções sejam executas concorrentemente Necessidade de escalonar transacções concorrentes Escalonamento ordem cronológica pela qual as instruções de várias transacções são executadas preservar a ordem das instruções de cada transacção 4 2
Escalonamento exemplos 1 e 2 T 1 transfere 50 de A para B T 2 transfere 10% de A para B estes são escalonamentos em série: 1 2 5 Escalonamento exemplos 1 e 3 O escalonamento 3 não é em série, mas é equivalente em ambos, a soma A+B é preservada 1 3 6 3
Escalonamento exemplos 3 e 4 O escalonamento 4 não preserva A+B 3 4 7 Ordem das instruções Num escalonamento onde há 2 instruções I 1 e I 2 (de 2 transacções T 1 e T 2 ) que acedem ao mesmo objecto Q I 1 = read(q), I 2 = read(q) a ordem de I 1 e I 2 é indiferente I 1 = read(q), I 2 = write(q) a ordem é importante 1 I = write(q), 2 I = read(q) a ordem é importante 1 I = write(q), 2 I = write(q) a ordem não afecta nem T 1 nem T 2 mas afecta a próxima instrução de read(q) 8 4
Instruções de leitura e escrita 3 9 Serialização por conflitos Diz-se que existe um conflito se 1 I e 2 I tiverem de ser feitas numa certa ordem se não houver conflito, 1 I e 2 I podem ser trocadas 10 5
Objectivo da serialização Se cada transacção preserva a consistência da BD então o escalonamento em série também preserva logo, se for possível demonstrar que um escalonamento concorrente é serializável então esse escalonamento concorrente também preserva a consistência da BD 11 Teste de serialização Forma simples de determinar se um escalonamento é serializável construir um grafo de precedências os nós são transacções (T 1, T 2,..., T n ) os arcos são conflitos (T i T k ) desenha-se um arco de T i para T k se T i executa write(q) antes de T k executar read(q) T i executa read(q) antes de T k executar write(q) T i executa write(q) antes de T k executar write(q) 12 6
Teste de serialização exemplos 1 e 3 1 2 13 Teste de serialização exemplo 4 O escalonamento 4 não é serializável 4 14 7
Teste de serialização outros exemplos Um escalonamento é serializável se o seu grafo de precedências não tiver ciclos os algoritmos de detecção de ciclos têm complexidade temporal O(n 2 ) ou O(n+a) onde a é o número de arcos Se o grafo for acíclico, a série pode ser obtida por ordenação topológica qualquer ordem linear que respeite a ordem parcial do grafo 15 Problemas na serialização por conflitos Segundo os critérios, este escalonamento não é serializável mas sabemos que é válido (mantém A+B) exigiria análise das operações para além de read e write... 16 8
Recuperação em escalonamentos Uma transacção que complete com sucesso tem uma instrução de commit como última instrução commit commit Uma transacção que falhe tem uma instrução de abort como última instrução ao que se segue o rollback da transacção 17 Recuperação em escalonamentos abort commit Quando T 8 falha, T 9 já completou e não pode ser cancelada este escalonamento não é recuperável 18 9
Escalonamentos recuperáveis Considerar apenas escalonamentos recuperáveis estes escalonamentos devem obedecer à seguinte condição: Para qualquer par de transacções T i e T k se T i executa write(q) antes de T k executar read(q) então T i faz commit antes de T k fazer commit commit commit 19 Rollback encadeado Erro numa transacção pode levar ao rollback de várias transacções abort commit Comportamento indesejado pode obrigar a desfazer várias tarefas já realizadas 20 10
Rollback encadeado Considerar apenas escalonamentos sem hipótese de rollback encadeado estes escalonamentos devem obedecer à seguinte condição: Para qualquer par de transacções T i e T k se T i executa write(q) antes de T k executar read(q) então T i faz commit antes de T k fazer read Esta condição garante que o escalonamento é também recuperável 21 Controlo de concorrência Os escalonamentos admissíveis devem ser serializáveis, recuperáveis e preferencialmente sem rollbacks encadeados um sistema em que só corre 1 transacção de cada vez garante isto, mas elimina a concorrência são necessários mecanismos que permitam a concorrência, mas garantam as condições desejadas 22 11
Níveis de isolamento menos exigentes Algumas operações não exigem 100% de consistência p.ex. uma consulta que determina de forma aproximada o saldo médio de todas as contas p.ex. o cálculo de dados estatísticos para optimização de operações Estas transacções não precisam de ser serializadas com outras poupam-se as verificações e deixa-se a transacção correr em livremente em paralelo solução de compromisso entre exactidão dos resultados e desempenho do sistema 23 Níveis de isolamento em SQL Nível de isolamento Dirty reads Non-repeatable reads Phantom reads SERIALIZABLE não não não REPEATABLE READ não não possível READ COMMITTED não possível possível READ UNCOMMITTED possível possível possível Dirty read: é possível ler dados que ainda não foram committed Non-repeatable read: ao ler duas vezes o mesmo registo dentro da mesma transacção, obtém-se valores diferentes Phantom read: ao fazer duas vezes a mesma query dentro da mesma transacção, o número de registos é diferente 24 12
Definição de transacções em SQL As linguagens de manipulação de dados têm de ter elementos para dizer que acções fazem parte de uma transacção Em SQL, qualquer operação inicia implicitamente uma transacção que só termina com commit torna os resultados permanentes rollback cancela a transacção actual 25 Exemplo com Postgres Executar uma transacção start transaction; commit; ou rollback; Vários sistemas usam autocommit por omissão se start transaction for omitido cada operação é uma transacção commit automático no fim da operação 26 13
Exemplo com Postgres Verificar saldos: select balance from account where account_number = 'A-101'; select balance from account where account_number number = 'A-102'; Transferir 350 da conta A-101 para a conta A-102: start transaction; update account set balance = balance 350 where account_number = 'A-101'; update account set balance = balance + 350 where account_number = 'A-102'; commit; 27 14