Departamento: Departamento de Ciências Exatas e Informática Curso: Ciência da Computação Semestre: 4o Ano: 2001 Disciplina: Banco de Dados II Créditos: 04 Professora: Cristina Paludo Santos Processamento de Transações – Resumo Conceitos Básicos “Uma transação é uma unidade de trabalho do usuário (aplicação) que é atômica do ponto de vista da aplicação.” [DATE 81] A transação é a unidade de execução de operações de bancos de dados. Quando executamos comandos SQL, cada instrução de consulta ou modificação do BD é uma transação. Por outro lado, quando estivermos usando uma interface de SQL incorporada, o programador controlará a extensão de uma transação, que pode incluir várias consultas ou modificações, bem como operações executadas na linguagem host. Em aplicações que suportam SQL incorporado, as transações começam assim que as operações no BD são executadas, e terminam com um comando COMMIT ou ROLLBACK (abordar) explícito. Uma transação deve ser executada de forma atômica. É a conhecida lei do TUDO ou NADA, ou seja, a transação deve ser executada até o final ou nada deve ser executado. Assegurar que as transações serão executadas corretamente é o trabalho de um gerenciador de transação, um subsistema que executa várias funções, inclusive: 1. Emitir sinais para o gerenciador de log, de modo que informações necessárias sob a forma de “registros de log” possam ser armazenados; 2. Assegurar que as transações em execução concorrente não irão interferir umas com as outras de forma a produzir erros (controle de concorrência); O gerenciador de transações e suas interações são apresentados na figura abaixo: Gerenciador de Gerenciador de Processador de Log Transação Consultas Gerenciador de Gerenciador de Buffer Recuperação Dados Log Processamento de Transações – Banco de Dados II 1 O gerenciador de transações enviará mensagens sobre ações de transações ao gerenciador de log, ao gerenciador de buffer sobre quando será possível ou necessário copiar o buffer de volta para o disco e ao processador de consultas, a fim de executar as consultas e outras operações do BD que constituem a transação. O gerenciador de log mantém o log. Ele deve lidar com o gerenciador de buffer, pois o espaço para o log aparece inicialmente em buffer de memória principal, e em certos momentos estes buffers devem ser copiados para o disco. O log, bem como os dados, ocupa espaço no disco. O gerenciador de recuperação é acionado quando ocorrer uma pane no SBD. Ele examinará o log e o utilizará para reparar os dados, se necessário. Como sempre, o acesso ao disco se dá através do gerenciador de buffer. Execução correta de transações Antes de lidarmos com a correção de erros do BD, precisamos entender o que significa para uma transação ser executada “corretamente”. Um banco de dados tem um estado, que é um valor para cada um de seus elementos (tabelas ou tuplas). Intuitivamente, consideramos certos estados consistentes e outros inconsistentes. Os estados consistentes satisfazem a todas as restrições do esquema do banco de dados, como as restrições de chaves ou restrições sobre valores. Porém, os estados consistentes também devem satisfazer as restrições implícitas que estão na mente do projetista de BD. As restrições implícitas podem ser mantidas por gatilhos (triggers), que fazem parte do esquema do BD, mas elas poderiam ser mantidas apenas por advertências associadas à interface do usuário através das quais as atualizações são efetuadas. Considerando que o BD consiste nas relações: StarIn (Title, Year, StarName) MovieStar (Name, Address, Gender, Birthdate) Podemos afirmar que uma restrição de chave estrangeira como “todo valor de StarName aparece como um valor de Name em MovieStar”, ou uma restrição de valor como “o valor de Gender pode ser apenas ‘M’ ou ‘F’”. O estado do BD é consistente se e somente se todas as restrições são satisfeitas pelos valores atuais das duas relações. Uma suposição fundamental sobre transações é: O princípio da correção: Se uma transação é executada na ausência de quaisquer outras transações ou erros do sistema e se ela começa com o BD em um estado consistente, então o BD também estará consistente quando a transação terminar. No entanto, há uma controvérsia sobre o princípio da correção que forma a motivação tanto para as técnicas de regsitros de log, quanto paras os mecanismos de controle de concorrência. A controvérsia envolve dois pontos: 1. A transação é atômica; isto é, ela deve ser executada como um todo ou nada ser executado. Se apenas parte de uma transação for executada, haverá uma boa chance de que o estado do BD resultante não seja consistente; Processamento de Transações – Banco de Dados II 2 2. Transações executadas simultaneamente têm probabilidade de levar a um estado inconsistente, a menos que sejam tomadas atitudes para controlar suas interações (escalonamentos em controle de concorrência). Propriedades das transações (1) Atomicidade: o programa que executa a transação deve, ou executar por completo e com sucesso sobre o BD, ou deve parecer nunca ter executado (lei do Tudo-ou-Nada). Esta propriedade é, normalmente, garantida pelo SGBD através de seu componente de Recovery (recuperação em caso de falha). (2) Consistência: A transação só pode realizar operações corretas, do ponto de vista da aplicação, sobre o BD. Isto é, a transação não pode transgredir qualquer restrição de integridade declarada ao SGBD; (3) Isolamento: em ambientes multiusuários (multiprogramado), a execução de uma transação não deve ser influenciada pela execução de outras. Esta propriedade é, normalmente, garantida pelo SGBD através de seu componente de Controle de Concorrência (schedule). (4) Durabilidade: o resultado de uma transação que termina com sucesso deve permanecer inalterado no BD até que outra transação os altere e também termine com sucesso. Isto é, o resultado das transações que terminam com sucesso deve sobreviver as falhas. Esta propriedade é, normalmente, garantida pelo SGBD através de seu componente de Recovery. Estados de uma transação Uma transação inicia-se num estado ativo. Quando alcança sua última instrução, ela enra num estado parcialmente executado. Neste ponto a transação completou sua execução, mas ainda é possível que venha entrar no estado falhado, desde que a saída propriamente dita ainda não tenha sido gravada em disco. Caso a execução ocorra normalmente, ou seja, a transação é completada com sucesso, entra num estado executado ou compromissado (committed). Uma transação entra no estado falhado depois de ser determinado que a transação não pode mais prosseguir com sua execução normal. Tal transação precisa ser desfeita. Uma vez realizado o rollback a transação entra no estado abordado. Parciamente Executado Executado/ Compromissado Ativo Falhado Abordado Operações primitivas de transações O SBD reside na memória não-volátil. O BD é dividido em unidades de armazenamento de tamanho fixo chamadas blocos (cada bloco contém um conjunto de dados e a verificação de em qual bloco está um determinado dado é feito automaticamente pelo sistema), que são unidades tanto de alocação quanto de transação. Processamento de Transações – Banco de Dados II 3 As transações transferem informações do disco para a memória princial e depois as devolvem para o disco. Desta forma, há dois espaços de endereços que interagem de modos importantes: 1. O espaço de blocos de disco que contêm os elementos do BD (“blocos físicos”); 2. O espaço de endereços da memória principal que é gerenciado pelo gerenciador de buffer (“bloco lógico ou de buffer”); As operações de entrada e saída são feitas em unidades de blocos, sendo que os movimentos de blocos entre disco e memória principal são iniciados pelas operações INPUT(X) e OUTPUT (X). INPUT(X) – Transfere o bloco físico contendo o elemento X do BD para a memória. OUTPUT(X) – Transfere o bloco de buffer que contém o elemento X para o disco. Memória Principal Disco INPUT (X) X OUTPUT (X) X Além disso, transações interagem com o BD transferindo dados de variáveis de programa para o BD e vice-versa. Esta interação se dá através de duas operações básicas: - READ (X, t): Copia o elemento X do BD para a variável local t da transação. Caso o bloco onde esteja o elemento X não estiver na memória, realiza-se primeiro a operação INPUT(X). - WRITE (X, t): Copia o valor da variável local t para o elemento do BD X em memória. Caso o bloco onde esteja o elemento X não estiver na memória, realiza-se primeiro a operação INPUT(X) É importante observar que os componentes que emitem esses comandos são diferentes. READ e WRITE são emitidos por transações, enquanto INPUT e OUTPUT são emitidos pelo gerenciador de buffer. OUTPUT também pode ser iniciado pelo gerenciador de log, sob certas circunstâncias (conforme veremos adiante). Exemplo: A fim de ver como as operações primitivas anteriores se relacionam com aquilo que uma transação poderia fazer, vamos considerar um banco de dados que tem 2 elementos A e B, com a restrição de que eles devem ser iguais em todos os estados consistentes. A transação T consiste logicamente nas duas etapas a seguir: A:= A * 2; B:= B * 2; O único requisito de consistência para o BD é A = B, e se T começa em um estado correto e completa suas atividades sem interferência de outra transação ou erro do sistema, então o estado final também deve ser consistente. Isto é, T duplica dois elementos iguais para obter novos elementos iguais. A execução de T envolve a leitura de A e B a partir do disco, a execução das operações aritméticas nas variáveis locais e a gravação dos novos valores de A e B em seus buffers. Poderíamos expressar T como a sequência de 6 etapas relevantes: Processamento de Transações – Banco de Dados II 4 READ (A, t); t:=t*2; WRITE (A, t); READ (B, t); t:=t*2; WRITE (B, t); Além disso, o gerenciador de buffer eventualmente executará as etapas de OUTPUT para gravar esses buffers de volta no disco. Supomos inicialmente que A = B = 8. Os valores das cópias da memória e do disco de A e B e da variável local t estão indicados para cada etapa. Ação t Mem A Mem B Disco A Disco B READ (A, t) 8 8 8 8 t:= t *2 16 8 8 8 WRITE (A, t) 16 16 8 8 READ (B, t) 8 16 8 8 8 t:= t *2 16 16 8 8 8 WRITE (B, t) 16 16 16 8 8 OUTPUT(A) 16 16 16 16 8 OUTPUT(B) 16 16 16 16 16 Na primeira etapa, T lê A, o que gera um comando INPUT(A) para o gerenciador de buffer, se o bloco de A ainda não estiver em um buffer. O valor de A também é copiado pelo comando READ na variável local t. A segunda etapa duplica t; ela não tem nenhum efeito sobre A, seja em um buffer ou no disco. A terceira etapa grava t em A do buffer; ela não afeta A em disco. As 3 etapas seguintes fazem o mesmo para B, e as duas últimas etapas copiam A e B no disco. Observe que, desde que todas essas etapas sejam executadas, a consistência do BD é preservada. Se ocorrer um erro do sistema antes de OUTPUT(A) ser executado, não haverá nenhum efeito sobre o BD armazenado em disco; será como se T nunca fosse executada e a consistência será preservada. Contudo, se houver um erro do sistema após OUTPUT(A) mas antes de OUTPUT(B), então o BD ficará num estado inconsistente. Não podemos impedir que essa situação ocorra, mas podemos nos preparar para que, quando ela ocorrer, o problema possa ser reparado – quer A e B sejam ambos redefinidos como 8 quer ambos sejam alterados para 16. Exercícios: 1. Suponha que a restrição de consistência no BD seja 0 A B. Informe se cada uma das transações a seguir preserva a consistência. a) A:= A + B; B:= A + B; b) A:= B + 1; B:= A + 1; 2. Para cada uma das transações do exercício anterior, adicione as ações de leitura e gravação ao cálculo e mostre o efeito das etapas sobre a memória principal e o disco. Suponha que inicialmente A = 5 e B = 10. Informe também se é possível, com a ordem apropriada de ações OUTPUT, assegurar que a consistência é preservada, mesmo se houver uma pane enquanto a transação está sendo executada. Processamento de Transações – Banco de Dados II 5 3. O exemplo abaixo representa uma transação que efetua uma transferência bancária. Considere que os valores de A e B são, respectivamente, R$ 1.000,00 e R$ 2.000,00. Caso ocorra um erro no sistema depois que OUTPUT(A) foi executado, mas antes de ser executado OUTPUT(B) o BD entrará num estado inconsistente. Qual das duas alternativas abaixo você indicaria para recuperar a consistência do BD ? Transação T: READ (A, a1); a1:= a1 – 50; WRITE (A, a1) READ (B, b1); b1:= b1 + 50; WRITE (B, b1) - Reiniciar a transação (reexecutar) - Matar a transação (não-reexecutar) Processamento de Transações – Banco de Dados II 6