SCC0141 - Bancos de Dados
e Suas Aplicações
Transações
Prof. Jose Fernando Rodrigues Junior
Material original: Profa. Elaine Parros Machado de Sousa
1
Transações

Transação: Unidade lógica de trabalho

abrange um conjunto de operações de manipulação de
dados que executam uma única tarefa
Conecta ao Banco de Dados
Começa transação
Operações de consulta/atualização
...
Finaliza transação
Começa transação
Operações de consulta/atualização
...
Finaliza transação
Desconecta
Transações

Transição de Estados de Execução
begin (start) transaction
ativa
read,
write
end
transaction
parcialmente
efetivada
commit
efetivada
abort
(rollback)
abort
(rollback)
falha
encerrada
Transações


O que acontece se a energia acabar no meio
de uma transação, ou se houver um
problema com o disco?
O que acontece quando duas transações
executam simultaneamente manipulando o
mesmo dado?
 O banco de dados pode ser levado a um
estado inconsistente...
Falhas
Tipo de falha
Local
Local
Global
De sistema
(soft crash)
Global
De meio físico
(hard crash)
Abrangência
Apenas a
transação
corrente
Todas as
transações em
andamento
Todas as
transações em
andamento
Como
evitar/recuperar
Registro de
log/controle de
concorrência
Registro de log
Backup
Transações –
Propriedades ACID




Atomicidade
Consistência
Isolamento
Durabilidade
Transações –
Propriedades ACID

Atomicidade: todas as operações de uma transação
devem ser efetivadas; ou, na ocorrência de uma falha,
nada deve ser efetivado


Consistência: transações preservam a consistência da
base



“tudo ou nada” – não se admite parte de uma operação
Estado inicial consistente  Estado final consistente
Isolamento: a maneira como várias transações em
paralelo interagem (o que pode ser lido e o que pode
ser escrito por cada uma) deve ser bem definido
Durabilidade: uma vez consolidada (committed) a
transação, suas alterações permanecem no banco até
que outras transações aconteçam
Transações –
Propriedades ACID

Atomicidade: todas
as operações
Recuperação
de falhasde uma transação
devem ser efetivadas; ou,viana
logocorrência de uma falha,
nada deve ser efetivado


Consistência: transações preservam a consistência da
base



“tudo ou nada” – não se admite parte de uma operação
Estado inicial consistente  Estado final consistente
Isolamento: a maneira como várias transações em
paralelo interagem (o que pode ser lido e o que pode
ser escrito por cada uma) deve ser bem definida
Durabilidade: umaRecuperação
vez consolidada
(committed) a
de falhas
transação, suas as alterações
via log permanecem no banco
até que outras transações aconteçam
Transações –
Propriedades ACID

Atomicidade: todas
as operações
Recuperação
de falhasde uma transação
devem ser efetivadas; ou,viana
logocorrência de uma falha,
nada deve ser efetivado


Consistência: transações
Controle depreservam
Concorrênciaa consistência da
base
via Locks



“tudo ou nada” – não se admite parte de uma operação
Estado inicial consistente  Estado final consistente
Isolamento: a maneira
como
várias transações em
Controle de
Concorrência
paralelo interagem (o que
via pode
Locks ser lido e o que pode
ser escrito por cada uma) deve ser bem definida
Durabilidade: umaRecuperação
vez consolidada
(committed) a
de falhas
transação, suas as alterações
via log permanecem no banco
até que outras transações aconteçam
Controle de Concorrência

Execução Serial (sequencial):
B
A
t1

t2
Execução Intercalada:
B
B
A
t1
A
t2
t3
t4
t5 tempo
t3
tempo
Controle de Concorrência

Execução
Serial
(sequencial):
transações executadas em sequência


diversas
deixa a base de dados em estado correto e consistente
Execução Intercalada: comandos de diversas
transações são intercalados

pode levar a inconsistências
Isolamento
Serial
Intercalada
Concorrência
Chance de
inconsistências
Execução Serial X Intercalada

Execução serial

estado inicial correto e consistente  estado final
correto e consistente
Execução Serial X Intercalada

Execução Intercalada

Toda execução serial é consistente

Mas uma execução intercalada só é consistente
se for igual ao resultado de uma execução em
sequência (em ordem conhecida)

esta execução é dita serializável
Problemas de Execução
Intercalada

Ocorrência de anomalias
1. leitura inválida
2. leitura não repetível
3. leitura fantasma
Problemas de Execução
Intercalada

1) Leitura inválida (Dirty Read):
 transação T’ lê
um dado modificado por uma
transação T que ainda não terminou;

permite que outras transações possam ver os
dados que ainda não foram consolidados
(committed), isto é, mudanças que podem ser
descartadas em seguida, por causa de uma
instrução ROLLBACK por exemplo.
Problemas de Execução
Intercalada

Ex: Leitura inválida (Dirty Read):
T1
tempo
Read(A)
Write(A+100)
T2
Exemplo 1:
Read(A)
Write(A  0)
rollback
• Transação T1: deposita R$100,00
na conta A.
• Transação T2: saca tudo de A.
commit
• T1 é cancelada
Problemas de Execução
Intercalada

Resultado:
foi possível
sacar R$
Ex: Leitura
inválida
(Dirty
Read):
100,00 a mais.
T1
tempo
Read(A)
Write(A+100)
T2
Exemplo 1:
Read(A)
Write(A  0)
rollback
• Transação T1: deposita R$100,00
na conta A.
• Transação T2: saca tudo de A.
commit
• T1 é cancelada
Problemas de Execução
Intercalada

Ex: Leitura inválida (Dirty Read):
T1
tempo
Read(A)
Write(A-100)
T2
• Transação T1: transfere
R$100,00 da conta A para a
Read(A-100)
conta B.
Write((A-100)+1%)
Read(B)
Write(B+100)
• Transação T2: incrementa A e B
em 1% (juros).
Read(B)
Write(B+1%)
rollback
Exemplo 2:
commit
Problemas de Execução
Intercalada

Exemplo 2:
Suponde que inicialmente A = 500 e B =
Read(A)
600
Write(A-100)
• resultado esperado: T1 (rollbacked)
Read(A-100)
Write((A-100)+1%) seguido de T2 é A = 505 (A+1%) e B =
606 (B+1%)
Read(B)
Write(B+100)
• no entanto, com T1 e T2 em paralelo,
o que se tem é: A = 404 (A - 100 + 1%)
Read(B)
e B = 707 (B+100 + 1%)
Write(B+1%)
T1
tempo
Ex: Leitura inválida (Dirty Read):
rollback
T2
commit
Problemas de Execução
Intercalada

Exemplo 2:
Suponde que inicialmente A = 500 e B =
Dirty read
Read(A)
600
Write(A-100)
• resultado esperado: T1 (rollbacked)
Read(A-100)
Write((A-100)+1%) seguido de T2 é A = 505 (A+1%) e B =
606 (B+1%)
Read(B)
Write(B+100) Dirty read
• no entanto, com T1 e T2 em paralelo,
o que se tem é: A = 404 (A - 100 + 1%)
Read(B)
e B = 707 (B+100 + 1%)
Write(B+1%)
T1
tempo
Ex: Leitura inválida (Dirty Read):
rollback
T2
commit
Problemas de Execução
Intercalada

Ex: Leitura
inválida
(Dirty
Read):
Resultado: a transferência de R$
100 de T1 foi
sobrescrita
e T2
Exemplo
2:
considerou valores
errados
como A = 500 e B =
Suponde
que inicialmente
Dirty
read
Read(A)
600de 1%. Ambos, A
base se cálculo
Write(A-100)
• resultado
esperado: T1 (rollbacked)
errados.
Read(A-100) e B estão
tempo
T1
T2
Write((A-100)+1%) seguido de T2 é A = 505 (A+1%) e B =
606 (B+1%)
Read(B)
Write(B+100) Dirty read
Read(B)
Write(B+1%)
rollback
commit
• no entanto, com T1 e T2 em paralelo,
o que se tem é: A = 404 (A - 100 + 1%)
e B = 707 (B+100 + 1%)
Problemas de Execução
Intercalada

2) Leitura não repetível (Nonrepeatable Read):




transação T lê um dado
esse dado é modificado por uma transação T’ que
começou depois de T
T é efetivada
se T’ tentar reler o mesmo dado, obterá valores
diferentes (nonrepeatable read)
tempo
Problemas de Execução
Intercalada

Ex: Leitura não repetível (Nonrepeatable Read):
T1
T2
Read(A=lotado-1)
Write(A)
commit
Read(A=lotado-1)
Write(A  A+1)
commit
Exemplo:
• Transação T1: lê reservas de um
vôo e verifica que há apenas
um lugar disponível.
• Transação T2: lê a mesma coisa
• T2 reserva o último lugar e é
efetivada.
• T2 tenta reservar o lugar e
ocorre um erro.
Problemas de Execução
Intercalada

Ex: Leitura não repetível (Nonrepeatable Read):
T1
T2
tempo
Read(A=lotado-1)
Write(A)
commit
Read(A=lotado-1)
Write(A  A+1)
commit
Nonrepeatable
Read
Exemplo:
• Transação T1: lê reservas de um
vôo e verifica que há apenas
um lugar disponível.
• Transação T2: lê a mesma coisa
• T2 reserva o último lugar e é
efetivada.
• T1 tenta reservar o lugar e
ocorre um erro.
tempo
Problemas de Execução
Intercalada
Resultado: um usuário foi
de que(Nonrepeatable
ainda havia
 Ex: Leitura informado
não repetível
Read):
lugares. Após preencher o
clicou confirma e
Exemplo:
T1
T2 cadastro,
recebeu um erro de que o vôo
Read(A=lotado-1)
• Transação T1: lê reservas de um
Read(A=lotado-1)
estava lotado.
vôo e verifica que há apenas
Write(A  A+1)
commit
um lugar disponível.
Write(A)
commit
Nonrepeatable
Read
• Transação T2: lê a mesma coisa
• T2 reserva o último lugar e é
efetivada.
• T1 tenta reservar o lugar e
ocorre um erro.
Problemas de Execução
Intercalada
Repeatable read? Mas não está
tempo

uma nova
leitura, mas
Ex: Leituraocorrendo
não repetível
(Nonrepeatable
Read):
sim uma escrita.
Exemplo:
T1
T2
Na verdade, há uma nova leitura
Read(A=lotado-1)
• Transação T1: lê reservas de um
Read(A=lotado-1)
pelo SGBD que validará a entrada
vôo e verifica que há apenas
Write(A  A+1)
de inserí-los.
commit dos dados antes
um
lugar
disponível.
Write(A)
commit
Nonrepeatable
Read
• Transação T2: lê a mesma coisa
• T2 reserva o último lugar e é
efetivada.
• T1 tenta reservar o lugar e
ocorre um erro.
Problemas de Execução
Intercalada

3) Leitura fantasma (Phantom Read):



transação T lê um conjunto de tuplas que
atendam a uma condição de consulta
transação T’ insere/remove/atualiza uma tupla
que atenderia a essa condição e é efetivada
se T refizer a mesma consulta, obterá um
conjunto diferente de tuplas (phantom read)
Problemas de Execução
Intercalada

Ex: Leitura fantasma (Phantom Read):
T1
T2
tempo
Query( )
Report()
Update( )
commit
Query( )
Report( )
commit
Exemplo:
• Transação T1: faz uma consulta que
retorna a média geral dos alunos que
têm média ponderada acima de 5.0, e
gera um relatório
• Transação T2: atualiza as notas de
alguns alunos e é efetivada
• T1 refaz a consulta para gerar
relatório com nro de alunos por faixa
de média
 relatórios inconsistentes.
Problemas de Execução
Intercalada

Ex: Leitura fantasma (Phantom Read):
Repeatable read vs Phantom read
Exemplo:
 Repeatable read:
lê valores
de umque
• Transação
T1:diferentes
faz uma consulta
Query( )
retornaestá
a média
geral
alunos que
mesmo dado que ainda
lá, mas
foidos
alterado
Report()
têm média ponderada acima de 5.0, e
Update( )
gera um relatório
 Phanton
de dados diferentes,
commitread: lê conjuntos
Transação T
as que
notasnão
de
2: atualiza
sendo que um dos• conjuntos
possui
dados
Query( )
alguns alunos e é efetivada
existem
no(s)
outro(s)
conjunto(s) – fantasmas.
Report( )
• T1 refaz a consulta para gerar
commit
relatório com nro de alunos por faixa
de média
 relatórios inconsistentes.
tempo
T1
T2
Problemas de Execução
Intercalada  Isolamento

Ocorrência de anomalias
1.
leitura inválida: leu um dado errado, o que causou
uma operação inconsistente;
2.
leitura não repetível: tentou ler um dado que foi
alterado, impedindo que uma operação consistente
fosse concluída;
3.
leitura fantasma: teve alterado o conjunto de tuplas
envolvidas em uma seleção – fazendo com que uma
operação tenha resultados diferentes em momentos
diferentes da transação
Problemas de Execução
Intercalada  Isolamento

Ocorrência de anomalias
Um mesmo dado é escrito e lido em paralelo.
1.
leitura inválida: leu um dado errado, o que causou
Solução: bloquear o dado que foi escrito, mas que ainda não foi consolidado, até que
uma
operação
a transação
de escrita
termine.inconsistente;
Uma transação só vê apenas os dados commited antes de seu início.
Um
dado lido
e escrito
em paralelo.
2.mesmo
leitura
não
repetível:
tentou ler um dado que foi
Solução: bloquear o dado que tenha sido lido até que a transação de leitura termine.
alterado,
impedindo
que bloqueia
uma operação
Evita leitura
inválida
e, além disso,
os dados consistente
depois de sua
primeirafosse
operação
de leitura ou escrita.
concluída;
Não há concorrência por um mesmo dado específico – o que ocorre é que os dados
envolvidos
variam
de maneirateve
imprevisível.
3.
leitura
fantasma:
alterado o conjunto de tuplas
Solução: bloquear conjuntos de tuplas inteiros até que a transação termine.
envolvidas
em uma
seleção
– fazendo
comsãoque
uma
Evita leitura
não repetível
e, além
disso, outras
transações
impedidas
caso elas
suas operações
comdiferentes
os dados da
transação
sendo
operação
tenhaintercalem
resultados
em
momentos
feita. diferentes da transação.
Transações –
Propriedades ACID

Atomicidade: todas as operações de uma transação
devem ser efetivadas; ou, na ocorrência de uma falha,
nada deve ser efetivado


Consistência: transações preservam a consistência da
base



“tudo ou nada” – não se admite parte de uma operação
Estado inicial consistente  Estado final consistente
Isolamento: a maneira como várias transações em
paralelo interagem (o que pode ser lido e o que pode
ser escrito por cada uma) deve ser bem definido
Durabilidade: uma vez consolidada (committed) a
transação, suas as alterações permanecem no banco
até que outras transações aconteçam
Problemas de Execução
Intercalada  Isolamento

Ocorrência de anomalias
1.
leitura inválida
2.
leitura não repetível
3.
leitura fantasma





Solução via isolamento em diferentes graus
Read uncommitted
Read committed
Repeatable read
Serializable
Interpretação
Nível de
isolamento
Anomalias que PODEM ocorrer
1) Leitura
inválida
2) Leitura não
repetível
3) Leitura
fantasma
Leitura mesmo do que
NÃO FOI committed
Sim
Sim
Sim
Leitura apenas do que
FOI committed
Não
Sim
Sim
Leitura apenas se a
leitura
repetida
for
garantida
Não
Não
Sim
Torna
a
execução
equivalente à execução
em série
Não
Não
Não
Níveis de Isolamento em
SQL99
Nível de
isolamento
Anomalias que PODEM ocorrer
1) Leitura
inválida
2) Leitura não
repetível
3) Leitura
fantasma
Read uncommitted
Sim
Sim
Sim
Read committed
Não
Sim
Sim
Repeatable read
Não
Não
Sim
Serializable
Não
Não
Não
Exercício

Considere as transações T1 e T2, executadas sobre
os itens de dado X e Y
T1
1.1)Read(X)
1.2)Read(Y)
1.3)Write(X)
1.4)commit
T2
2.1)Read(X)
2.2)Read(Y)
2.3)Write(X)
2.4)Write(y)
2.5)commit
1) Dê um exemplo de execução intercalada que resulte em
uma anomalia de leitura inválida e explique o porquê.
2) Dê um exemplo de execução intercalada que resulte em
uma anomalia de leitura não repetível e explique o
porquê.
Exercício

Considere as transações T1 e T2, executadas sobre
os itens de dado X e Y
T2
T1
2.1)Read(X)
1.1)Read(X)
2.2)Read(Y)
1.2)Read(Y)
2.3)Write(X)
1.3)Write(X)
2.4)Write(y)
1.4)commit
2.5)commit
1) Dê um exemplo de execução intercalada que resulte em uma
anomalia de leitura inválida e explique o porquê.
R.: 2.1,2.2,2.3,1.1,1.2,1.3,2.4,1.4,2.5
Aqui, T2 leu o valor de X e escreveu o valor de X (2.3), e antes de
consolidar este valor, T1 leu o valor de X (dirty read em 1.1), e
o reescreveu em 1.3. Em seguida T1 consolida os dados (1.4),
seguido da consolidação dos dados por T2 (2.5). Qual é o valor
de X, o que foi calculado por T2, ou o que foi calculado por T1?
Exercício

Considere as transações T1 e T2, executadas sobre
os itens de dado X e Y
T2
T1
2.1)Read(X)
1.1)Read(X)
2.2)Read(Y)
1.2)Read(Y)
2.3)Write(X)
1.3)Write(X)
2.4)Write(y)
1.4)commit
2.5)commit
1) Dê um exemplo de execução intercalada que resulte em uma
anomalia de leitura inválida e explique o porquê.
R.: exemplo, em T2 alguém transfere 100 de X para Y, situação em
que X deve ser X-100. antes que T2 termine no entanto, alguém
lê o saldo de X-100 e deposita mais 100. quando T1 terminar, T1
irá consolidar (X-100)+100, ao passo que T2 irá consolidar X100, anulando o que foi feito por T1.
Exercício

Considere as transações T1 e T2, executadas sobre
os itens de dado X e Y
T1
1.1)Read(X)
1.2)Read(Y)
1.3)Write(X)
1.4)commit
T2
2.1)Read(X)
2.2)Read(Y)
2.3)Write(X)
2.4)Write(y)
2.5)commit
2) Dê um exemplo de execução intercalada que resulte em
uma anomalia de leitura não repetível e explique o porquê.
R.: 1.1, 2.1, 2.2, 2.3, 1.2, 1.3, 1.4, 2.4, 2.5
Aqui T1 lê o valor de X, o que em seguida é alterado por T2
(2.3). T1 então tenta atualizar o valor de X (1.3), o qual
agora não aceita a atualização inicialmente pretendida por
T1.
Transações em Oracle
Transação em PostgreSQL

Comando SET TRANSACTION
SET TRANSACTION ISOLATION LEVEL {
SERIALIZABLE | REPEATABLE READ | READ
COMMITTED | READ UNCOMMITTED }
READ WRITE | READ ONLY
Transação em ORACLE

Comando SET TRANSACTION
SET TRANSACTION
READ ONLY | READ WRITE | ISOLATION LEVEL
{SERIALIZABLE | READ COMMITTED}|
USE ROLLBACK SEGMENT rollback_segment
NAME ‘nome_da_transacao’;
Níveis de Isolamento de
SQL99 no ORACLE
Nível de
isolamento
Anomalias que podem ocorrer
Leitura
inválida
Leitura não
repetível
Leitura
fantasma
Read uncommitted
Sim
Sim
Nunca permitido
em Oracle. Sim
Read committed
(padrão)
Não
Repeatable read
Não
Não
Não suportado especificamente
(abrangidoSim
por serializable).
Serializable
Não
Sim
Não
Sim
Não
Transações em ORACLE



Transações explícitas iniciam com a cláusula SET TRANSACTION
Em PostgreSQL, as transações se iniciam com START TRANSACTION
E terminam:
 explicitamente com commit ou rollback

execução de comando DDL
Possuem quatro possibilidades:
 Modo de leitura: para transações apenas leitura
 READ-ONLY, e READ-WRITE
 Modo de isolamento: para transações com atualizações
 READ committed, e SERIALIZABLE


implicitamente quando um processo de usuário é finalizado
 com sucesso – ex: disconnect (commit)
 sem sucesso – ex: falha de sistema (rollback)
Transação em ORACLE

Comando COMMIT



termina a transação
torna permanente as ações da transação
libera os recursos bloqueados
Transaçoes em ORACLE

Modo de isolamento:
atualizações

transações
com
READ committed (padrão):



para
antes de uma operação, a transação aguarda até que quaisquer tuplas
sendo atualizadas sejam liberadas e prossegue
a transação “vê” apenas dados consolidados (committed) antes do
início de uma dada operação
SERIALIZABLE:



caso uma tupla seja alterada após o início da transação serializable, se
houver uma tentativa de alteração desta tupla, será jogada a exceção:
ORA-08177: Can't serialize access for this transaction.
ou seja, o Oracle informa que não é capaz de tornar a concorrência
semelhante a um processamento em série
a transação “vê” apenas dados modificados pela própria transação e
dados efetivados antes do início da transação
Transaçoes em ORACLE

Modo de isolamento:
atualizações

para
transações
com
READ committed (padrão):
Idéia
deumaSnapshot
dos dados
umatuplas
antes de
operação, a transação
aguardaantes
até que de
quaisquer
sendo atualizadas
sejam
liberadas do banco.
operação
– vários
snapshots



a transação “vê” apenas dados consolidados (committed) antes do
início de uma dada operação
SERIALIZABLE:
caso uma tupla seja alterada após o início da transação serializable, se
houverde
uma tentativa
de alteração
tupla,antes
será jogada
Idéia
Snapshot
dos desta
dados
de a exceção:
uma
ORA-08177:
for this transaction.
transação
inteira Can't
– umserialize
únicoaccess
snapshot.
 ou seja, o Oracle informa que não é capaz de tornar a concorrência
semelhante a um processamento em série
 a transação “vê” apenas dados modificados pela própria transação e
dados efetivados antes do início da transação

Transações Distribuídas

Propriedades ACID devem ser
garantidas
 Atomicidade
Concorrência
distribuída
 Consistência
 Isolamento
Recuperação
de falhas
distribuída
 Durabilidade
48
Concorrência Distribuída

Problema: o mesmo dado replicado em diferentes sites A e B. No
site A, o dado é alterado, quase que imediatamente o site B usará
este dado, cuja cópia será diferente do valor no site A.

Solução: uso de locks. Quando o site A alterar o dado, deve-se
bloqueá-lo (lock) para uso e escrita até que A finalize sua operação e
o dado seja sincronizado com o site B.

Como gerenciar bloqueios (locks) de objetos (tabelas e fragmentos)
distribuídos?
 abordagem centralizada
 abordagem cópia primária
49
 abordagem completamente distribuída
Concorrência Distribuída

Baseada no conceito de Cópia Distinguida (ou Distinta): dentre
as várias cópias dos dados, uma delas dita como o controle de
concorrência é feito – isto é, uma única cópia recebe e libera
locks

A escolha da cópia que irá ditar o controle de concorrência pode
ser estático ou dinâmico

O site que possui a cópia distinguida é denominado site
Coordenador, o qual deverá responder ao sistema de locks
50
Concorrência Distribuída



Abordagem cópia primária
 bloqueios são gerenciados pelo site onde está a cópia primária
(original) do objeto requisitado
 problema? Maior complexidade
Abordagem completamente distribuída
 bloqueios
gerenciados nos sites onde ocorrem as operações –
coordenação dinâmica
 problema? Maior complexidade, necessidade de broadcast dinâmico
para informar sobre a coordenação
Abordagem centralizada
 um único site responsável por gerenciar todas as requisições de
bloqueio
 problema? Vulnerável a falhas, requer um backup – sobrecarga de um
único site
51
Recuperação de Falhas
Distribuída

Novos tipos de falha que não ocorrem em
SGBDs não distribuídos



falhas de comunicação
falha em um site onde uma sub-transação é
executada
Atomicidade:

ou todas as sub-transações são efetivadas
(committed) ou nenhuma deve ser efetivada
COMMIT protocol
Ex: Two-Phase Commit (2PC)
52
Recuperação de Falhas
Distribuída


Uso do two-phase commit protocol (2PC)
 Algoritmo
distribuído que visa gerenciar situações
transacionais – protocolo do tipo consensual
Duas fases
1ª. Contacta todos os participantes preparando-os para o
sistema de consenso, segundo o qual, após a execução
distribuída, cada um terá que “votar” sim (commit) ou não
(abort)
2ª. Efetivação da decisão consensual, todos são informados
de que devem consolidar a transação (todos votaram
commit) ou retornar ao estado anterior (pelo menos um
votou abort ou alcançou time-out)
53
Transações e Controle de
Concorrência

Referências



Oracle Database Concepts
OracleSQL Reference
Elmasri e Navathe. Fundamentals of Database
Systems
Download

Aula21_Transacoes