endereços "a execução"

Propaganda
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
Download