Controle de Concorrência em Transações Álvaro Vinícius de Souza Coêlho [email protected] Controle de Concorrência • Controle de Concorrência • Na prática várias transações estão acessando, alterando, incluindo e excluindo dados ao mesmo tempo • Isso pode gerar uma série de anomalias Controle de Concorrência • Uma transaçao T1 faz uma venda de 10 unidades de um certo item • Uma transação T2 idem • Neste dado momento o saldo disponível em estoque é de 15 unidades Controle de Concorrência • • • • T1 lê o saldo T1.Quant = 15 T2 lê o saldo T2.Quant = 15 Controle de Concorrência • Tanto para T1 quanto para T2 a operação é permitida • Mas uma das duas vai esbarrar no subsistema de integridade! (check saldo >= 0) • Outras anomalias podem ocorrer de maneira semelhante (leituras incorretas, perdas de atualizações, etc.) Controle de Concorrência • Bloqueio • As transações bloqueiam os dados que vão alterar • À medida que se faz um COMMIT ou um ROLLBACK os dados são desbloqueados • Dados só podem ser bloqueados por uma transação se não já estiverem bloqueados por outra Controle de Concorrência • Porque o desbloqueio ocorre em COMMIT ou ROLLBACK? • Para garantir a integridade Controle de Concorrência • Bloqueio em duas fases • Para se garantir que realmente não haverão anomalias, o bloqueio deverá ser feito em duas fases. – As transações bloqueiam os dados – As transações desbloqueiam os dados • As transações não bloqueiam os dados após haver algum desbloqueio Controle de Concorrência • Bloqueio Perpétuo (DeadLock) • Casos excepcionais • Um conjunto de transações pode ficar em espera eterna Controle de Concorrência • Exemplo: – Uma transação T1 de venda bloqueará a tabela Cliente e em seguida a tabela Estoque – Uma transação T2 de compra bloqueará a tabela Estoque e em seguida a tabela Contas – Uma transação T3 de cobrança bloqueará a tabela Contas e em seguida a tabela Cliente Controle de Concorrência • • • • • • • T1 inicia, e bloqueia a tabela Cliente T2 inicia, e bloqueia a tabela Estoque T3 inicia, e bloqueia a tabela Contas T1 está esperando pela tabela Estoque T2 está esperando pela tabela Contas T3 está esperando pela tabela Cliente DeadLock Controle de Concorrência • Como resolver? • Duas estratégias: – Detectar o DeadLock – Prevenir o DeadLock Controle de Concorrência • Detectar o DeadLock – Periodicamente (na menor fração de tempo possível sem comprometer a performance) verificar dependências entre transações, formando um grafo T1 T2 T3 Controle de Concorrência • Detectar o DeadLock – Caso o grafo forme um Ciclo, há a verificação de um DeadLock – Neste caso, uma transação é escolhida para ser desfeita e refeita (undo e redo) • A mais antiga • A mais recente • A que bloqueou mais recursos – A escolha varia de fabricante para fabricante Controle de Concorrência • Prevenir o DeadLock – Para cada tentativa de bloqueio, o SGBD constrói o grafo de dependência a priori – Caso o bloqueio venha a causar DeadLock, ele é “atrasado” por alguns instantes, e nova tentativa é feita. Controle de Concorrência • Melhor Prevenir ou Detectar (remediar)? • De modo geral a prevenção demanda mais esforço – Construção de gráficos de dependência a cada tentativa de bloqueio • A prevenção pode por uma transação “de castigo” por muito tempo - Solucionável (prioridade) Controle de Concorrência • Melhor Prevenir ou Detectar (remediar)? • A Detecção – Simples, mas resolver um DeadLock é caro pois transações com muitas operações podem precisar ser desfeitas ou refeitas • Pode matar uma mesma transação muitas vezes - Solucionável (troca de estratégia de escolha) Controle de Concorrência • De modo geral a regra é a seguinte: • Prevenir é melhor se há muitas ocorrências de DeadLock – Evita o custo de desfazê-los • Detectar é melhor se há poucas ocorrências de DeadLock – Evita o custo excessivo de construção de grafos Controle de Concorrência FIM! “Dada a Premissa: ‘Dar presentes é melhor que Receber’, eu faço o sacrifício” Groucho Marx Manet