Você está na página 1de 26

Cap.

4 SQL
As linguagens formais proporcionam uma notao concisa para a representao de
consultas, mas os bancos de dados comerciais precisam de uma linguagem de
consulta mais fcil para o utilizador a SQL combinao de construtores em lgebra
e clculo relacional.
Ela mais que simples linguagem de consulta pois permite tambm definir estruturas
de dados, modificar dados e especificao de restries de segurana.

4.1. Histrico
SQL=Structured Query Language Linguagem de Consulta Estruturada. Actual SQL-
92.
A linguagem SQL tem diversas partes:
Linguagem de definio de dados DDL
Linguagem interactiva de manipulao de dados DML: baseada na lgebra relacional
e no clculo relacional de tuplos.
Incorporao DML
Definio de vises
Autorizao
Integridade
Controle de transaces
Neste captulo cobre-se a DML interactiva e os recursos DML bsicos da SQL.
Usaremos como exemplo empresa com os seguintes esquemas de relaes:
Esquema_agncia=(nome_agncia, cidade_agncia, fundos)
Esquema_cliente=(nome_cliente, rua_cliente, cidade_cliente)
Esquema_emprstimo=(nome_agncia, nmero_emprstimo, total)
Esquema_devedor=(nome_cliente, nmero_emprstimo)
Esquema_conta=(nome_agncia, nmero_conta, saldo)
Esquema_depositante=(nome_cliente, nmero_conta)

4.2. Estruturas bsicas


Um banco de dados relacional consiste numa coleco de relaes, cada uma
designada por um nico nome.
A SQL permite o uso de valores nulos para indicar valores desconhecidos ou
inexistentes. H clusulas que permitem ao utilizador especificar quais os atributos
no podero receber valores nulos.
A estrutura bsica de uma expresso em SQL consiste em trs clususlas: selct, from
e where
select corresponde operao de projeco
from corresponde ao produto cartesiano
where corresponde seleco do predicado
ex: select A1, A2, ..., An
from r1, r2, ... , rm
where P
equivalente a A1,A2,...,An (P(r1xr2x...xrm)
Se a clusula where for omitida, o predicado P verdadeiro.
Diferentemente da lgebra relacional, o resultado de uma consulta em SQL pode
conter cpias mltiplas de alguns tuplos.

4.2.1. A Clusula Select


O resultado de uma consulta de SQL , naturalmente, uma relao.
ex: select nome_agncia
from emprstimo
Na prtica a eliminao de duplicidade consome tempo. As linguagens formais de
consulta baseia-se no facto de uma relao ser um conjunto.
Se quisermos mesmo eliminarmos a duplicidade: select distinct ...
Select all ...= por defeito.
O asterisco * pode ser usado para denotar todos os atributos
ex: select emprstimo.*
ex: select *
A clusula select pode conter expresses aritmticas envolvendo os operadores + - * /,
e os operandos constantes ou atributos das tuplas:
ex: select nome_agncia, nmero_emprstimo, total*100

4.2.2. A Clusula Where


ex: select nmero_emprstimo
from emprstimo
where nome_agncia = Perryridge and total > 1200
A SQL permite o uso de operadores de comparao para strings e expresses
aritmticas, assim como tipos especiais, como tipos de datas.
A SQL permite o operador between para simplificar a clusula where:
ex: where total between 90000 and 100000

4.2.3. A Clusula From


Por si s define um produto cartesiano das relaes na clusula. Uma vez que a
juno natural definida em termos de produto cartesiano, uma seleco e uma
projeco so um meio relativamente simples de escrever a expresso SQL para uma
juno natural:
nome_cliente, nmero_emprstimo(devedor >< emprstimo)
select distinct nome_cliente, devedor.nmero_emprstimo
from devedor, emprstimo
where devedor.nmero_emprstimo=emprstimo.nmero_emprstimo

4.2.4. A Operao Rename


Mecanismo para rebaptizar tanto relaes como atributos usando a clusula as.
A clusula as pode aparecer tanto na clusula select como na from
Por vezes, numa consulta derivamos nomes de atributos das antigas relaes para as
novas relaes/resultados. Nem sempre convm:
Primeiro porque nas relaes da clusula from podem existir atributos com o mesmo
nome e que resultaria em nomes duplicados; Segundo, se usarmos uma expresso
aritmtica na clusula select, o atributo resultante no teria um nome; terceiro, mesmo
que o nome do atributo possa ser derivado das relaes de base, podemos desejar
mudar o nome:
ex: select distinct nome_cliente, devedor.nmero_emprstimo as id_emprstimo

4.2.5. Variveis Tuplos


A clusula as particularmente til na definio do conceito de varivel tuplo, como
feito no clculo realcional. Uma varivel tuplo precisa de estar associada a uma
relao em particular. So definidas na clusula from por meio do uso da clusula as.
ex: Para todos os clientes que possuem um emprstimo no banco, encontre os seus
nomes e respectivos nmeros de emprstimo:
select distinct nome_cliente, T.nmero_emprstimo
from devedor as T.emprstimo, emprstimo as S
where T.nmero_emprstimo = S.nmero_emprstimo
Variveis tuplos so mais teis para comparao de dois tuplos da mesma relao.
Poderamos tambm usar a operao rename.
ex: Encontrar os nomes de todas as agncias que tenham fundos maiores que ao
menos uma agncia daquelas localizadas em Brooklyn
select T.nome_agncia
from agncia as T, agncia as S
where T.fundos > S.fundos and S.cidade_agncia = Brooklyn
A ordenao de tuplos feita atributo a atributo.

4.2.6. Operaes com Strings


As operaes mais usadas so as checagens para verificao de coincidncias de
pares, usando ooperador like. Identificaremos esses pares por meio do uso de dois
caracteres especiais:
% - compara qualquer substring
_ - compara qualquer caracter
So sensveis a minsculas e maisculas (case sensitive)
ex: Perry% corresponde a qualquer string que comece por Perry
ex: select nome_cliente
from cliente
where rua_cliente like %Main%
permitido uso caracter de escape
ex: like ab\%cd% escape \
A SQL permite pesquisar diferenas em vez de coincidncias, usando o not like
Tambm permite concatenao (usando ||), extraco de substrings, indicao de
tamanhos de strings, converso de maisculas para minculas, etc.

4.2.7. Ordenao e Apresentao de Tuplos


Clusula order by
ex: select distinct nome_cliente
from devedor, emprstimo
where devedor.nmero_emprstimo=emprstimo.nmero_emprstimo
and nome_agncia=Perryridge
order by nome_cliente
Por defeito ordena de forma ascendente (asc). Se quisermos descendente devemos
acrescentar, no fim, desc.

4.2.8. Duplicidade
O uso de relaes com duplicidade (tuplos repetidos) por vezes til. A SQL d
tambm o nmero de repeties.
Podemos definir a semntica da duplicidade de uma consulta SQL usando verses
multiconjuntos dos operadores relacionais.
... ser preciso???

4.3. Operaes de Conjuntos


Os operadores SQL-92 union, intersect e except operam relaes e correspondem s
operaes U e - da lgebra relacional. Tambm aqui as relaes participantes das
operaes precisam de ser compatveis, isto , ter o mesmo conjunto de atributos.

4.3.1. A Operao de Unio


ex: Todos os clientes que possuam emprstimos ou conta ou ambos:
(select nome_cliente
from depositante)
union
(select nome_cliente
from devedor)
union, ao contrrio de select, elimina automaticamente as repeties. Se quisermos as
repeties fazemos union all

4.3.2. A Operao Interseco


Encontrar todos os clientes que tenham tanto emprstimos quanto contas no banco:
(select distinct nome_cliente
from depositante)
intersect
(select distinct nome_client
from devedor)
A operao intersect elimina todas as repeties. Para aparecerem -> intersect all

4.3.3. A Operao Excepto


Encontrar todos os clientes que tenham uma conta e nenhum emprstimo
(select distinct nome_cliente
from depositante)
except
(select nome_cliente
from devedor)
Tambm elimina repeties, excepto se escrevermos except all

4.4. Funes Agregadas


So funes que tomam uma coleco (um conjunto ou subconjunto) de valores como
entrada e retornam um valor simples. H 5:
Mdia (average) : avg
Mnimo (minimum) : min
Mximo (maximum) : max
Total (total) : sum
Contagem (count) : count
A entrada para sum e avg precisa ser um conjunto de nmeros. Os outros podem
operar tambm como outros tipos de dados, como strings, etc.
ex: Encontrar a mdia dos saldos em contas na agncia Perriridge
select avg (slado)
from conta
where nome_agncia = Perryridge
O resultado uma relao com atributo nico, contendo uma nica linha. Podemos
dar-lhe um nome com a clusula as.
Existem circunstncias em que queremos aplicar uma funo agregada no somente a
um conjunto de tuplos, mas tambm a um grupo de conjuntos de tuplos. Teremos de
usar a clusula group by. O atributo ou atributos fornecidos numa clusula group by
so usados para formar grupos.
ex: Encontrar a mdia dos saldos nas contas de cada uma das agncias do banco
select nome_agncia, avg (saldo)
from conta
group by nome_agncia
s vezes, mais interessante definir condies e aplic-las a grupos do que a tuplos.
Deve usar-se a clusula having.
ex: select nome_agncia, avg (saldo)
from conta
group by nome_agncia
having avg (saldo) > 1200
Usamos a funo count com muita frequncia para contar o nmero de tuplos numa
relao. A notao para essa funo count(*)
ex: select count(*)
from cliente
A SQL no permite o uso de distinct em count(*), mas permite em max e min.
Se uma clusula where e uma clusula having aparecem na mesma consulta, o
predicado que aparece em where aplicado primeiro. Os tuplos que satisfazem a
clusula where so, ento, colocadas em grupos por meio da clusula gropup by. A
clusula having, se presente, ento aplicada a cada grupo. Os grupos que no
satisfazem o predicado da clusula having so removidos. Os grupos remanescentes
so usados pela clusula select.
ex: encontre o saldo mdio para cada cliente que mora em Harrison e tenha ao
menos 3 contas
select depositante.nome_cliente, avg(saldo)
from depositante, conta, cliente
where depositante.nmero_conta=conta.nmero_conta and
depositante.nome_cliente=client.nome_cliente and
cidade_cliente = Harrison
group by depositante.nome_cliente
having count (distinct depositante.nmero_conta) >= 3

4.5. Valores Nulos


Podemos usar a palavra-chave null como predicado para testar a existncia de valores
nulos.
ex: select nmero_emprstimo
from emprstimo
where total is null
O predicado is not null testa a ausncia de valores nulos.
O uso de valores nulos em operaes aritmticas e comparaes causa diversas
complicaes. O resultado de uma expresso aritmtica (envolvendo, por exemplo, +,
-, * ou /) nula se qualquer um dos valores for nulo. O resultado de qualquer
comparao envolvendo uma valor nulo pode ser imaginado como falso. Mais
precisamente, a SQL trata os resultado destas comparaes como unknown, que no
true nem false, embora muitas vezes seja tratado comop false.
Tambm complica o clculo de funes agregadas, como sum. Em vez de dizer que a
soma nula, o operador sum pode ignorar os valores nulos de entrada. Em geral,
todas as funes agregadas (excepto count(*)) ignoram os valores nulos.

4.6. Subconsultas aninhadas


As aplicaes mais comuns para as subconsultas so testes para membros de
conjuntos, comparaes de conjuntos e cardinalidade de conjuntos.

4.6.1. Membros de Conjuntos


Verificar se um tuplo membro ou no de uma relao. Usa-se o conectivo in (ou not
in) que testa os mebros de um conjunto, no qual o conjunto a coleco de valores
produzidos por select.
ex: select distinct nome_cliente
from devedor
where nome_cliente in (select nome_cliente
from depositante)
===> H um volume substancial de redundncia no SQL.
Os operadores in e not in tambm podem ser usados em conjuntos enumerados:
ex: select distinct nome_cliente
from devedor
where nome_cliente not in (Smith, Jones)

4.6.2. Comparao de Conjuntos


Encontre os nomes de todas as agncias que tenham fundos maiores que ao menos
uma agncia localizada no Brooklyn (dif de 4.2.5.)
select nome_agncia
from agncia
where fundos > some (select fundos
from agncia
where cidade_agncia = Brooklyn)
=some idntico a in, mas <> no a mesma coisa que not in. any sinnimo de
some, mas as ltimas verses s permitem o some devido ambiguidade lingustica
de any.

ex: de uso de > all


select nome_agncia
from agncia
where fundos > all (select fundos
from agncia
where cidade_agncia = Brooklyn)
all idntico a not in.
Como exemplo final de comparaes de conjuntos, encontre a agncia que tem o
maior slado mdio. Funes agregadas no podem ser agregadas em SQL, pelo que
no podemos usar max(avg(...)). Ento, estrategicamente:
select nome_agncia
from conta
group by nome_agncia
having avg(saldo) >= all (select avg (saldo)
from conta
group by nome_agncia)

4.6.3. Verificao de Relaes Vazias


A SQL possui meios para testar se o resultado de uma subconsulta possui algum
tuplo. Usa-se o construtor exists que retorna o valor true de o argumento de uma
subconsulta n-ao-vazio.
ex: Encontre todos os clientes que tenham tanto conta como emprstimo no banco
select nome_cliente
from devedor
where exists (select *
from depositante
where depositante.nome_cliente = devdor.nome_cliente)
tambm se pode testar a no existncia de tuplos na subconsulta por meio do
construtor not exists.
Este construtor pode ser usado para simular operaes com conjuntos contidos
(superconjuntoos): podemos escrver a relao A contm a relao B como not exists
(B except A). Embora no seja padro do SQL-92, o operador contains existiu
nalgumas verses de SQL.
ex: Encontre todos os clientes que tenham uma conta em todas as agncias do
Brooklyn
select distinct S.nome_cliente
from depositante as S
where not exists (select nome_agncia
from agncia
where cidade_agncia = Brooklyn)
except
(select R.nome_agncia
from depositante as T, conta as R
where T.nmero_conta = R.nmero_conta and
S.nome_cliente = T.nome_cliente))

4.6.4. Teste para a Ausncia de Tuplos Repetidos (numa subconsulta)


O construtor unique retorna o valor true caso o argumento da subconsulta no possua
nenhum tuplo repetido.
ex: Encontre todos os clientes que tenham somente uma conta na agncia
Perryridge
select T.nome_cliente
from depositante as T
where unique (select R.nome_cliente
from conta, depositante as R
where T.nome_cliente = R.nome_cliente and
R.nmero_conta = conta.nmero_conta and
conta.nome_agncia = Perryridge)
O not unique pode ser utilizado para encontrar todos os clientes que tenham pelo
menos duas contas...
O teste de unique falha se um dos campos for null

4.7. Relaes Derivadas


O SQL permite o uso de uma expresso de subconsulta na clusula from. Nesse caso,
a relao resultante deve receber um nome e os atributos precisam de ser
rebaptizados, com as.
ex: (select nome_agncia, avg(saldo)
from depositante
group by nome_agncia
as resultado (nome_agncia, saldo_mdio)
Depois podemos usar o resultado desta subconsulta numa consulta.

4.8. Vises
ser preciso???

4.9. Modificao no Banco de Dados


Adicionar, Remover e Alterar

4.9.1. Remoo
Um pedido de remoo de dados expresso muitas vezes do mesmo modo que uma
consulta.
Podemos remover apenas tuplos inteiros.
delete from r
where P
ex: delete from depositante
where nome_cliente = Smith
ex: delete from conta
where nome_agncia in (select nome_agncia
from agncia
where cidade_agncia = Perryridge)
Assim, podemos ver que podemos atingir mais que uma relao numa operao de
delete, por meio de comandos select-from-where aninhados numa clususla where de
um delete.
Os tuplos a remover tambm podem ser da relao da clusula delete:
ex: delete from conta
where saldo < (select avg (saldo)
from conta)
importante que todos ostestes sejam efectuados antes de remover.

4.9.2. Insero
Para inserir dados numa relao podemos especificar um tuplo a ser inserido ou
escrever uma consulta cujo resultado um conjunto de tuplos a inserir.
ex: + simples: insert into conta
values (Perryridge, A-9732, 1200)
Para quem no se lembrar da ordem:
insert into conta (nome_agncia, nmero_conta, saldo)
values (Perryridge, A-9732, 1200)
ou qualquer outra ordem.
+ genericamente: insert into conta
select nome_agncia, nmero_emprstimo, 200
from emprstimo
where nome_agncia = Perryridge
mal: insert into conta
select *
from conta
Pode inserir-se tuplos com atributos a null, mas, com DDL pode impedir-se isso se
assim o pretendermos.

4.9.3. Actualizaes
ex: update conta
set saldo = saldo * 1.05
ex: update conta
set saldo = saldo * 1.06
where saldo > 10000
update conta
set saldo = saldo*1.05
where saldp <= 10000
ateno ordem, portanto.

4.9.4. Actualizaes de uma Viso


preciso?...

4.10. Composio de Relaes


Alm de fornecer o mecanismo bsico do produto cartesiano para a composio dos
tuplos de uma relao disponvel nas primeiras verses de SQL, a SQL-92 tambm
oferece diversos outros mecanismos para composio de relaes como as junes
condicionais e as junes naturais, assim como vrias formas de junes externas.
Essas operaes adicionais so usadas tipicamente como expresses de
subconsultas na clusula from.

4.10.1. Exemplos
emprstimo inner join devedor on emprstimo.nmero_emprstimo =
devedor.nmero_emprstimo
Os atributos do resultado consistem nos atributos da relao da esquerda seguidos
dos atributos da relao da direita (com repetio).
podemos rebaptizar a relao resultado, bem assim como os atributos resultado, com
a clusula as.

O left outer join processado como se segue: Primeiro, o resultado da juno interna
(inner join) processado como anteriormente. Ento, para todo o tuplo t da relao
emprstimo do lado esquerdo que no apresente correspondncia com nenhum tuplo
da relao devedor do lado direito da juno interna, um tuplo r adicionado ao
resultado da juno da maneira como ser descrita. Os atributos do tuplo r que so
derivados da relao do lado esquerdo so preenchidos pelos valores do tuplo t e os
restantes so preenchidos com o valor nulo.

O right outer join semelhante, mas ao contrrio.

Finalmente consideremos o natural join


ex: emprstimo natural inner join devedor
semelhante ao inner join inicial, excepto que os atributos no aparecem repetidos.
4.10.2. Tipos de Junes e Condies
Embora as expresses para juno externa sejam normalmente usadas na clusula
from, elas podem ser usadas em qualquer lugar onde se usa uma relao.
Cada uma das variantes das operaes de juno em SQL-92 consiste num tipo de
juno e numa condio de juno. As condies de juno definem quais os tuplos
das duas relaes apresentam correspondncia e quais atributos so apresentados no
resultado de uma juno. O tipo de juno define como os tuplos em cada relao que
no possuam nenhuma correspondncia (baseado na condio de juno) com os
tuplos da outra relao devem ser tratados.
Tipos de Juno
inner join Condies de juno
left outer join natural
right outer join on <predicate>
full outer join using (A1,A2,...,An)
O uso de uma condio de juno obrigatrio para junes externas, mas opcional
para junes internas (se for omitido, o resultado o produto cartesiano).
Sintacticamente, a palavra-chave natural aparece antes do tipo de juno, embora as
condies on e using apaream no final de uma expresso de juno. As palavras-
chave inner e outer so opcionais, uma vez que os nomes dos demais tipos de
junes nos permitem deduzir do que se trata.

Na natural, os atributos da juno (isto , os atributos comuns a ambas as relaes)


aparecem primeiro, conforme a ordem que aparecem na relao do lado esquerdo.
Depois vm todos os atributos para os quais no h correspondncia aos da relao
do lado esquerdo e, finalmente, todos os atributos sem correspondncia aos da
relao do,lado direito.

A condio de juno using(A1,A2,...,An) similar condio de juno natural,


excepto pelo facto de que seus atributos de juno so os atributos A,A2,...,An em vez
de todos os atributos comuns a ambas as relaes. Os atributos A1,A2,...,An devem
ser somente os atributos comuns a ambas as relaes e eles aparecem apenas uma
vez no resultado da juno.

ex: Encontre todos os clientes que tenham uma conta, mas nenhum emprstimo no
banco
select d-CN
from (depositante left outer join devedor
on depositante.nome_cliente = devedor.nome_cliente)
as db1 (d-CN, nmero_conta, b-CN, nmero_emprstimo)
where b-CN is null

cross join = juno interna sem uma condio de juno


union join = juno externa total na condio de falso, em que a juno interna vazia.

4.11. Linguagem de Definio de Dados


A SQL DDL permite no s a especificao de um conjunto de relaes, como
tambm infromaes acerca de cada uma das relaes, incluindo:
O esquema de cada relao
O domnio dos valores associados a cada atributo
As regras de integridade
O conjunto de ndices para manuteno de cada relao
Informaes sobre segurana e autoridade sobre cada relao
A estrutura de armazenamento fsico de cada relao no disco.
vamos, agora, s discutir os dois primeiros:
4.11.1. Tipos de Domnios em SQL
Cap 4. EXERCCIOS
4.1. Considere o banco de dados da empresa de seguros mostrada abaixo, em que as
chaves primrias esto sublinhadas. Construa as seguintas consultas em SQL para
este banco de dados relacional.
pessoa(ss#, nome, endereo)
automvel(licena, ano, modelo)
acidente(data, motorista, total_danos)
proprietrios(ss#, licena)
sinistro(licena, data, motorista)
(a) Encontre o nmero total de pessoas cujos automveis estiveram envolvidos em
acidentes em 1989.
select count distinct motorista
from acidente
where data=1989
(b) Encontre o nmero de acidentes em que os automveis de John Smith estiveram
envolvidos
CAP. 6 REGRAS DE INTEGRIDADE
As regras de integridade fornecem a garantia de que mudanas feitas na base de
dados por utilizadores autorizados no resultem em perda de consistncia dos dados.
Como vimos no cap.2 para o modelo E-R, essas regras possuem a seguinte forma:
Declarao de chaves: no duplos de chaves candidatas.
Forma de um relacionamento: um para um, ...
Embora arbitrrias, na prtica so limitadas s que podem ser verificadas com o
mnimo tempo de processamento.

6.1. Restries de Domnios


So as mais elementares formas de restries de integridade.
A clusula check permite modos poderosos de restries de domnios. Permite ao
projecto do esquema determinar um predicado que deva ser satisfeito por qualquer
valor designado a uma varivel cujo tipo seja o domnio.
ex: create domain turno_trabalho numeric(5,2)
constraint valor_teste_turno check(value >= 4,00)
ex: create domain nmero_conta char(10)
constraint teste_nulo_nmero_conta check(value not null)
ex: create domain tipo_conta char(10)
constraint teste_tipo_conta check (value in (Corrente, Poupana))

6.2. Integridade Referencial


Frequentemente desejamos garantir que um valor que aparece numa relao para um
dado conjunto de atributos tambm aparea para um certo conjunto de atributos de
outra relao. Essa condio chamada integridade referencial

6.2.1. Conceitos Bsicos


tuplos pendentes quando h tuplos de uma relao r que no pode ser combinado
com um tuplo da relao s, aquando da sua juno natural. Tuplos pendentes podem
ser aceitveis ou no.
ex: indesejvel em conta, existir t1[nome agncia] = Lunartown e na relao
agncia no haver nenhuma Lunartown.
aceitvel: o contrrio.
A diferena tem origem em:
- O atributo nome_agncia do Esquema_conta uma chave estrangeira (foreign key)
cuja referncia a chave primria do Esquema_agncia
- O atributo nome_agncia do Esquema_agncia no uma chave estrangeira.
==> Regras de integridade referencial ou subconjunto dependente:
(r2) K1(r1)

6.2.2. Integridade Referencial no Modelo E-R


Cada Ki do esquema de R uma chave estrangeira que leva a uma regra de
integridade referencial.
Outra fonte de regras de integridade referencial so os conjuntos de entidades fracas.

6.2.3. Modificaes no Banco de Dados


As modificaes no banco de dados podem originar violao das regras de integridade
referencial. H que fazer pois verificaes para preservar (r2) K1(r1):
- Insero: Se t2 inserida em r2 ---> t2[] k(r1)
- Remoo: Se t1 removida de r1, o siatema deve tratar tambm o conjunto de
tuplos em r2 que so referidos por t1. Pode haver cascata.
- Actualizao: Mistura das duas anteriores...

6.2.4. Integridade Referencial em SQL


possvel definir chaves primrias, secundrias (candidatas ?) e estrangeiras como
parte do comando create table da SQL:
Forma simplificada para declarar que uma nica coluna uma chave estrangeira:
Nome_agncia char(15) references agncia
ex:
create table cliente
(nome_cliente char(20) not null,
rua_cliente char(30),
cidade_cliente char(30),
primary key (nome_cliente))

create table agncia


(nome_agncia char(15) not null,
cidade_agncia char(30),
fundos integer,
primary key (nome_agncia),
check (fundos >= 0))

create table conta


(nmero_conta char(10) not null,
nome_agncia char(15),
saldo integer
primary key (nmero_conta),
foreign key (nome_agncia) references agncia,
check (saldo >=0))

create table depositante


(nome_cliente char(20) not null,
nmero_conta char(10) not null,
primary key (nome_cliente, nmero_conta)
foreign key (nome_cliente) references cliente,
foreign key (nmero_conta) references conta)

Quando uma regra de integridade referencial violada, o procedimento normal


rejeitar a aco que ocasionou essa violao.
Mas, na clusula relativa a foreign key pode especificar-se os passos para modificao
do tuplo que contm a referncia, de modo a garantir a regra de integridade.
ex: create table conta
...
foreign key (nome_agncia) references agncia
on delete cascade
on update cascade,
...)
A SQL-92 tambm permite que a clusula foreign key especifique outros tipos de
aces alm de cascata, como alterar o campo em questo (no caso nome_agncia)
com nulos, ou um valor padro...
A semntica de chaves em SQL torna-se mais complexa pelo facto de a SQL permitir
valores nulos. As seguintes regras, algumas das quais arbitrrias, so usadas para
tratar esses valores nulos.
Todos os atributos de uma chave primria so declarados implicitamente not null.
Atributos de uma declarao unique (isto , atributos de uma chave candidata) podem
ser nulos, contanto que no sejam declarados no-nulos de outro modo. S sa iguais
se no houver nulos numa das colunas, pelo menos.
Atributos nulos em chaves estrangeiras so permitidos, o que implica a sua aprovao
na regra da integridade.
Dada esta complexidade e arbitrariedade natural das formas e comportamento de
restries (ou regras) de integridade em relao a valores nulos, o melhor assegurar
que todas as colunas especificadas em unique e foreign key sejam declaradas no
permitindo nulos.

6.3. Asseres
Uma assero um predicado que expressa uma condio que desejamos que seja
sempre satisfeita no banco de dados. Restries de domnio e regras de integridade
so formas especiais de asseres. Outros ex:
A soma de todos os totais em conta emprstimo de cada uma das agncias deve ser
menor que a soma de todos os saldos das contas dessa agncia.
Todo o emprstimo deve ter ao menos um cliente que mantenha uma conta com saldo
mnimo de 1000 dlares.

create assertion <nome_assero> check <predicado>

ex:1: create assertion restrio_soma check


(not exists (select * from agncia
where (select sum(total) from emprstimo
where emprstimo.nome_agncia = agncia.nome_agncia)
>= (select sum(total) from conta
where conta.nome_agncia = agncia.nome_agncia)))
preciso usar as asseres com muito cuidado pois a sua verificao pode ser
pesada para o sistema, que precisa de as verificar em cada actualizao, para alm
do incio.

6.4. Gatilhos (Triggers)


Um gatilho um comando que executado pelo siatema automaticamente, em
consequncia de uma modificao no banco de dados. Duas exigncias devem ser
satisfeitas para o projecto de um mecanismo de gatilho:
1. Especificar as condies sob as quais o gatilho deve ser executado
2. Especificar as aces que sero executadas quando um gatilho for disparado.
So teis para avisos, por ex.
ex:
define trigger saldo_negativo on update of conta T
(if new T.saldo<0
then (insert into emprstimo values
(T.nome_agncia, T.nmero_conta, - new T.saldo)
insert into devedor
(select nome_cliente, nmero_conta
from depositante
where T.nmero_conta = depositante.nmero_conta)
update conta S
setS.saldo=0
where S.nmero_conta=T.nmero.conta))
Os gatilhos so chamdaos s vezes de regras(rules) ou regras activas (active rules),
mas no devem ser confundidas com as regras da datalog.

6.5. Dependncia Funcional


um tipo particular de restries. uma generalizao da noo de (super)chave.

6.5.1. Conceitos Bsicos


--> se para qualquer t1[] = t2[], t1[] =t2[]
A dependncia funcional permite-nos expressar restries que as superchaves no
expressam.
Podemos usar dependncia funcional de dois modos:
1. Usando-as para estabelecimento de restries sobre um conjunto de relaes
vlidas... F realiza-se em R
2. Usando-as para verificao de relaes... r satisfaz F.

--> trivial se

Para distinguir os conceitos de uma relao que satisfaz uma dependncia e de uma
dependncia realizando-se num esquema, voltemos ao ex. do banco.
Se considerarmos a relao cliente (com o Esquema_cliente), como mostrado,
notamos que rua_cliente -> cidade_cliente satisfeita. Mas, no mundo real, possvel
que duas cidades distintas tenham o mesmo nome de rua. Logo, no incluiremos a
dependncia no conjunto de dependncias funcionais que so realizadas no
Esquema_cliente.
Na relao emprstimo (do Esquema_emprstimo) vemos que nmero_emprstimo-
>total satisfeita. Aqui diferente, pois na vida real normal que cada conta tenha
apenas um total. Portanto queremos que a condio nmero_emprstimo -> toatla
seja sempre satisfeita para a relao emprstimo. Por outras palavras, precisamos da
restrio nmero_emprstimo -> total para o Esquem_emprstimo.
J na relao agncia, nome_agncia -> fundos realaizada no Esquema_agncia, j
o mesmo no se passando com o inverso, embora na relao, essa dependncia
possa ser satisfeita.

Embora o SQL no fornea um modo simples para especificao de dependncias


funcionais, podemos escrever consultas para verificao de dependncias funcionais,
assim como criar asseres para garantia de dependncias funcionais.

Quando projectamos um banco de dados relacional, primeiro relacionamos as


dependncias funcionais que sempre precisam ser realizadas.
Ex: No Esquema_agncia: nome_agncia --> cidade_agncia
nome_agncia --> fundos
No Esquema_cliente: nome_cliente --> cidade_cliente
nome_cliente --> rua_cliente

6.5.2. CLAUSURA (FECHO) DE UM CONJUNTO DE DEPENDNCIAS FUNCIONAIS


No basta considerar um dado conjunto de dependncias funcionais. preciso
considerar todos os conjuntos de dependncias funcionais que so realizadas.
Podemos mostrar que dado um conjunto F de dependncias funcionais, prova-se que
outras dependncias funcionais realizam-se (conjunto logicamente implcito em F).
ex:ex: esquema R(A,B,C,G,H,I)
e A --> B
A --> C
CG --> H
CG --> I
B --> H
A --> H logicamente implcita

O fecho de F o conjunto de todas as dependncias funcionais logicamente implcitas


em F. Denotamos por F+
Dado F podemos computar F+ pela definio de DF, mas existem tcnicas mais
simples.
1 Trs axiomas ou regras para inferncia
Regra da Reflexividade:
Se conjunto de atributos e , ento --> realiza-se
Regra de Incremento:
Se --> se realiza e um conjunto de atributos, ento --> tambm
se realiza
Regra da Transitividade:
Se --> e --> se realizam, ento --> tambm se realiza.
Estas regras so slidas e completas. So os Axiomas de Armstrong.
Embora sejam completos, enfadonho utiliz-los directamente para computao de
F+. Ento, para simplificar, adicionamos regras adicionais:
Regra da Unio:
Se --> e --> se realizam, ento --> tambm se realiza.
Regra de Decomposio:
Se --> se realiza, ento --> e --> tambm se realizam.
Regra da Pseudotransitividade:
Se --> e --> se realizam, ento --> tambm se realiza

6.5.3. CLAUSURA DE CONJUNTOS DE ATRIBUTOS


Para verificar se um conjunto de atributos uma superchave, precisamos conceber
um algoritmo para computar o conjunto de atributos determinados funcionalmente por
. Esse algoritmo tambm ser til na determinao do fecho de um conjunto F.

Chamamos o conjunto dos atributos funcionalmente determinados por , sob um


conjunto de dependncias funcionais F, de fecho de . Denotamos por +
Em pseudo pascal:
resultado := ;
while (mudanas em resultado) do
for each funcional dependncia --> in F do
begin
if resultado then resultado := resultado U ;
end

exerccio: provar que AG superchave.

6.5.4. COBERTURA CANNICA


Sempre que uma actualizao realizada na relao, o sistema de banco de dados
deve garantir que todas as dependncias funcionais em F sejam satisfeitas no novo
estado do banco de dados.
Para reduzir os esforos de teste: Qualquer banco de dados que satisfaa um conjunto
simplificado de dependncias funcionais deve tambm satisfazer o conjunto original, e
vice-versa, uma vez que os dois conjuntos tm o mesmo fecho.

Um atributo de uma dependncia funcional extrnseco se podemos remov-lo sem


alterar o fecho do conjunto de dependncias funcionais.
Formalmente:
A extrnseco a se A, e F implica logicamente (F-{-->}) U {(-A) --> }
A extrnseco a se A, e o conjunto de dependncias funcionais (F-{-->}) U {(-
-> (-A)} implica logicamente F.

Uma cobertura cannica Fc para F o conjunto de dependncias tal que F implique


logicamente todas as dependncias de Fc e Fc implique logicamente todas as
dependncias de F. Alm disso Fc deve apresentar as seguintes propriedades:
Nenhuma dependncia funcional em Fc contm um atributo extrnseco
Cada lado esquerdo da dependncia funcional em Fc nico. Isto , no h
duas dependncias 1 --> 1 e 2 -.-> 2 em Fc tal que 1 = 2

Uma cobertura cannica pode ser computada como:


repeat
Use a regra de unio para substituir todas as dependncias funcionais
em F da forma 1 --1 e 1 --> 2 por 1 --> 12
Encontre as dependncias funcionais --> com um atributo
extrnseco em ou em
Se um atributo extrnseco encontrado, remova-o de -->
until F no mude

exerccio:
Computar a cobertura cannica para F, sendo F, no esquema (A,B,C)
A --> BC
B --> C
A --> B
AB --> C
Soluo: A --> B
B --> C

EXERCCIOS:
6.7. Por que h certas dependncias funcionais chamadas de triviais?
Porque so dependncias funcionais satisfeitas por todas as relaes. Em geral, uma
dependncia funcional --> trivial se

6.8. Relacione todas as dependncias atendidas (satisfeitas na) pela relao da figura:

A B C
a1 b1 c1
a1 b1 c2
a2 b1 c1
a2 b1 c3

A --> B
AC --> B
+ as triviais : A --> A B --> B C --> C AB --> A, etc.

6.9. Use a definio de dependncia funcional para discutir como funciona cada um
dos axiomas da Armstrong (reflexividade, aumento e transitividade)
Reflexividade:
se t1[] = t2[] e ento forosamente =. Logo t1[] = t2 []
Incremento:
se t1[] = t2[] , de --> temos que t1[] = t2[]. Como, por reflexividade --> ,
se t1[] = t2[] ento t1[] = t2[]
Transitividade: Est feito na pgina 204 do livro.

6.10. Explique como a dependncia funcional pode ser usada par explicar o seguinte:
Um conjunto de relacionamentos um para um entre o conjunto de entidades
estudantes e orientador.
Um conjunto de relacionamentos muitos para um entre o conjunto de entidades
estudantes e orientador.

estudantes --> orientador


orientador --> estudantes

estudantes --> orientador


6.15. Compute a clausura do seguinte conjunto F de dependncias funcionais do
esquema de relao R= (A,B,C,D,E)
A --> BC
CD --> E
B --> D
E --> A
Relacione as chaves candidatas de R

BC --> E pela pseudotransitividade


E --> BC pela transitividade
A --> B e A --> C pela decomposio
E --> B e E --> C pela decomposio
E --> D pela transitividade
E --> ABCD pela unio
E --> ABCDE pela reflexividade e unio
A --> E pela transitividade
A --> BCE pela unio
A --> ABCD pela reflexividade, transitividade e unio
A --> ABCDE pela unio
BC --> ABCDE pela transitividade
CD --> ABCDE pela transitividade
===> chaves candidatas: A , E , BC e CD

6.16. Usando as dependncias funcionais do exerccio anterior, compute B+

pelo algoritmo da pgina 206 do livro:


0. resultado = B
1. resultado = B U D pois B --> D
resultado final = BD

Se fosse pedido para o A:

6.17. Usando as dependncias funcionais dos exerccios anteriores, compute a


cobertura cannica Fc

Usando o algoritmo da pgina 207 do livro:


ver se C extrnseco em A --> BC
(F-{A-->BC}) U {A --> (BC-C)}
CD-->E A-->B
B-->D
E-->A

BC-->E pela pseudotransitividade


E -->A pela transitividade
E --> B pela transitividade
A-->D pela transitividade
AC-->E
A-->BD
AC-->E pela pseudotransitividade
AC-->AB pela transitividade e unio
no me parece

e o B?
tambm no.
ver se C ou D so extrnsecos em CD-->E
(F {CD->E}) U {(CD D) -->E}
A-->BC U C-->E
B-->D
E-->A
CD-->E

A-->B
A-->C
A-->D
A-->E
CD-->A
BC-->E
BC-->A

Ento a cobertura cannica ser mesmo o conjunto das dependncias dadas. No


possvel reduzir.
CAP. 13 TRANSACES

Normalmente considera-se que um conjunto de vrias operaes no banco de dados


uma nica unidade do ponto de vista do utilizador.
O essencial ser a concluso de todo o conjunto de operaes, ou que, no caso de
uma falha, nenhuma delas ocorra. Seria inaceitvel o dbito sem o crdito numa
transferncia.
As operaes que formam uma nica unidade lgica de trabalho so chamadas
transaces.
Alm disso o banco deve administrar a execuo de vrias transaces de modo a
evitar a ocorrncia de inconsistncias.

13.1. Conceito de transaco


Uma transaco uma unidade de execuo de programa que acessa e,
possivelmente, actualiza vrios itens de dados. geralmente o resultado de um
programa em SQL e delimitada por begin transaction e end transaction.
Para assegurar a integridade dos dados, exigimos que o sistema de banco de dados
mantenha as seguintes propriedades (ACID) das transaces:
Atomicidade: todas as operaes ou nenhumas
Consistncia: Uma transaco isolada preserva a consistncia do banco de dados.
Isolamento: Embora possa ocorrer transaces concorrentes cada uma delas tem a
sensao de que a outra acabou antes de se iniciar
Durabilidade: Mudanas persistem at mesmo se houver falhas no sistema.

Ex: Transaco em contas de um banco.


Vamos supor que o banco de dados reside permanentemente em disco, mas que
alguma parte dele reside, temporariamente, na memria principal.
O acesso ao banco de dados obtido pelas duas seguintes operaes:
read(X), que transfere o item de dados para um buffer alocado transaco
write(X) que transfere do buffer localpara o banco de dados.
Num banco de dados real, o write no resulta necessariamente na actualizao dos
dados em disco, pode ser armazenado na memria temporariamente.
ex: Ti: read(A);
A:= A 50;
write(A);
read(B);
B:=B+50;
write(B)

Consistncia:
A exigncia de consistncia significa que que a soma de A com B deve permanecer
inalterada aps a execuo da transaco.
responsabilidade do programador da aplicao que codifica a transaco. Esta
tarefa pode ser facilitada por meio do teste automtico dos requisitos de integridade,
conforme visto no cap. 6.
Atomicidade:
Suponhamos que h uma falha a meio, depois de write(A) mas antes de write(B) da
transaco (falta de energia, falha da mquina ou de software). Ento a soma de A+B
no preservada --> estado inconsistente.
A ideia bsica por detrs da atomicidade a seguinte: O sistema de banco de dados
mantm um registo (em disco) dos antigos valores de quaisquer dados sobre os quais
a transaco executa uma gravao e, se a transaco no for completada, os valores
antigos so restabelecidos para parecer que nada dela foi executado.
da responsabilidade do prprio sistema de banco de dados.
Durabilidade:
Garante que uma vez completada a transaco com sucesso, todas as actualizaes
realizadas permanecero mesmo que depois haja uma falha no sistema.
Suponhamos agora que uma falha se d e h perda de dados na memria, mas no
no disco. Podemos garantir a durabilidade se se garantir uma de:
1. As actualizaes realizadas pela transaco foram gravadas em disco, antes da
transaco se completar
2. Informaes gravadas no disco, sobre as actualizaes realizadas pela transaco,
so suficientes para que o banco de dados possa reconstruir essas actualizaes
quando o sitema for reiniciado aps uma falha.
da responsabilidade do componente de gerenciamento de recuperao.
Isolamento:
Quando h mais que uma transaco em simultneo (concorrentes) com operaes
que podem ser intercaladas.
Uma soluo realizar transaces em srie mas isso muito ineficiente. H pois
outras tcnicas que veremos frente.
da responsabilidade do componente de controlo de concorrncia.

13.2. ESTADO DA TRANSACO


Se houver falha a transaco deve ser abortada e, nesse caso, quaisquer
actualizaes j feitas devem ser desfeitas --> transaco desfeita (rolled back
retornada). da responsabilidade do sistema de recuperao.
Uma transaco efectuada com sucesso diz-se efectivada (committed). Para desfazer
os seus efeitos s atravs de uma transaco de compensao.
Uma transaco deve estar num dos seguintes estados:
Activa, ou estado inicial: quando est a executar-se
Em efectivao parcial: aps a execuo da ltima declarao (ainda na memria
principal, pelo que ainda pode ser abortada)
Em falha: Quando se descobre que a execuo normal j no se pode continuar
Abortada: depois de desfeita
Em efectivao: Aps concluso com sucesso.

Diz-se concluda se estiver em efectivao ou abortada.


Depois de entrar no estado abortada, o sistema tem duas opes:
Reiniciar a transaco (excepto se for falha por erro lgico da transaco) --> nova
transaco
Matar a transaco (erro lgico da transaco)

13.3. IMPLEMENTAO DE ATOMICIDADE E DURABILIDADE


O componente de recuperao de um banco de dados implementa o suporte
atomicidade e durabilidade.
Ex de esquema simples mas muito ineficiente: cpias shadow (sombra) com
db_pointer. Diz-se que uma transaco foi efectivada quando o db_pointer actualizado
escrito no disco. O sistema de disco garante que actualizar o db_pointer
atomicamente.

13.4. EXECUES CONCORRENTES


Traz diversas complicaes em relao consistncia dos dados.
muito fcil insistir na execuo sequencial das transaces, porm h dois fortes
motivos para que os sistemas reais permitam a concorrncia:
1. A CPU e os discos num sistema informtico podem operar em paralelo, o que
aumenta a eficincia.
2. Na sequencial, uma transaco curta poderia ter de esperar muito tempo por uma
longa. Logo, se as transaces esto operando em diferentes partes do banco de
dados, melhor deix-las concorrer, o que reduz os tempos de atraso e o tempo
mdio de resposta.
Vamos introduzir o conceito de escalas de execuo (schedules) para ajudar na
identificao de quais ordens de execuo podem garantir a manuteno da
consistncia.
Aqui a consistncia garantida pelos mecanismos de controlo de concorrncia.
EX:
Escala1:
T1 T2
read(A)
A:=A-50
write(A)
read(B)
B:=B+50
write(B)
read(A)
temp:=A*0,1
A:=A-temp
write(A)
read(B)
B:=B+temp
write(B)
Incio: A=1000 e B=2000
Se T1 e depois T2 --> A=855 e B=2145 (escala 1)
Se T2 e depois T1 --> A=850 e B=2150 (escala 2)
As sequncias apresentadas so chamadas de escalas de execuo ou s de
escalas: representam a ordem cronolgica por meio da qual as instrues so
executadas.
As escalas 1 e 2 so sequenciais. H sempre n! escalas sequenciais.
Se o controlo da execuo concorrente deixado completamente sob
responsabilidade do sistema operativo, muitas escalas de execuo possveis, so
factveis, mesmo aquelas que deixam o sistema num estado inconsistente (criao ou
desaparecimento de dinheiro)
tarefa do banco de dados, atravs do componente de controlo de concorrncia
garantir quer isso no possa suceder.
Temos pois que garantir que a escala usada seja equivalente a uma escala
sequencial.

13.5. SERIALIZAO
Vamos s considerar as operaes significativas do ponto de vista da escala de
execuo: read e write.

13.5.1. SERIALIZAO DE CONFLITO


vamos considerar uma escala de execuo S com duas instrues sucessivas, Ii e Ij ,
das transaces Ti e Tj (ij), respectivamente. Se Ii e Ij se referem a itens de dados
diferentes, ento podemos alternar Ii e Ij sem afectar os resultados de qualquer
instruo da escala. Porm, se Ii e Ij se referem ao mesmo item de dados Q, ento a
ordem dos dois passos pode importar. Como s considermos read e write, h 4
casos a analisar:
1. Ii=read(Q) , Ij=read(Q) : a sequncia de execuo de Ii eIj no importa j que o
mesmo valor de Q lido a despeito da ordem.
2. Ii=read(Q) , Ij=write(Q) : A ordem importa
3. Ii=write(Q) , Ij=read(Q) : A ordem importa
4. Ii=write(Q) , Ij=write(Q) : Importa, do ponto de vista do prximo read

Dizemos que Ii e Ij entram em conflito caso elas pertenam a difeentes transaces,


agindo no mesmo item de dado, e pelo menos uma dessas operaes de write.
Se Ii e Ij no entram em conflito podemos trocar a sua ordem que a escala S assim
obtida equivalente a S.
Se formos trocando a ordem e chegarmos a uma escala sequencial, quer dizer que os
efeitos da escala inicial so os mesmos de uma escala sequencial. Dizemos que S e
S so equivalentes no conflito.
Dizemos que uma escala de execuo conflito serializvel se ela equivalente no
conflito a uma escala de execuo sequencial.
possvel ter duas escalas de execuo que produzam o mesmo resultado, mas que
no seja, equivalentes no conflito.
H definies menos restritivas de equivalncia de escala que a equivalncia de
conflito, mas em geral tal anlise onerosa em termos computacionais. Mas h outras
puramente baseadas em read e write:

13.5.2. VISO SERIALIZADA


S e S so ditas equivalentes na viso se as trs condies seguintes forem satisfeitas:
1. Para cada item de dados Q, se a transaco Ti fizer uma leitura no valor inicial de Q
na escala S, ento a transaco Ti tambm deve, na escala S , ler o valor inicial de Q.
2. Para cada item de dados Q, se a transaco Ti executar um read(Q) na escala S, e
aquele valor foi produzido por meio da transaco Tj (se houver), ento a transaco
Ti tambm dever, na escala S, ler o valor de Q que foi produzido por meio da
transaco Tj
3. Para cada item de dados Q, a transaco (se houver) que executa a operao final
writ(Q) na escala S tem de executar a operao write(Q) final em S.

A escalas 1 e 2 no so equivalentes na viso mas a 1 e 3 j so.


escala 3: T1 T2
read(A)
write(A)
read(A)
write(A)
read(B)
write(B)
read(B)
write(B)

Dizemos que S tem viso serializada se for equivalente em viso a uma escala de
execuo sequencial.

Ex: de escala viso serializvel mas no conflito serializvel:


T3 T4 T6
read(Q)
write(Q)
write(Q)
write(Q)

13.6. RECUPERAO
Se uma Ti falha, precisamos de desfazer os seus efeitos, mas tambm necessario
assegurar que qualquer transaco Tj que dependa de Ti seja abortada.
Para assegurar isso temos de colocar restries aos tipos de escalas que se podem
usar.

13.6.1. ESCALAS DE EXECUO RECUPERVEIS


S devero ser permitidas escalas recuperveis.
Uma escala recupervel aquela na qual, para cada par de transaces Ti e Tj, tal
que Tj leia itens de dados previamente escritos por Ti, a operao de efectivao de Ti
aparea antes de operao de efectivao de Tj.

13.6.2.
ESCALAS EM CASCATA
O retorno em cascata indesejvel, mesmo em escalas recuperveis, j que leva a
destruir uma quantidade de trabalho. Logo, conveniente restringir s sem cascata.
Uma escala sem cascata aquela na qual para cada par de transaces Ti e Tj, tal
que Tj leia um item de dados previamente escrito por Ti, a operao de efectivao de
Ti aparea antes da operao de leitura de Tj. Toda a escala sem cascata
recupervel.

13.7. IMPLEMENTAO DO ISOLAMENTO


As escalas que so conflito ou viso serializvel e sem cascata assegura que o banco
de dados fica sempre num estado consistente e trata seguramente as possveis falhas
de transaco.
H vrios esquemas para assegurar isso (controle de concorrncia) a despeito do
S.Operativo usado. O mais trivial o lock usado por uma transaco que entra em
execuo. mas isso ineficiente, sendo geradas apenas escalas sequenciais.

13.8. DEFINIO DE TRANSACO EM SQL


Uma linguagem de manipulao de dados deve possuir um construtor para especificar
o conjunto de aces que constitui uma transaco.
No padro SQL ela comea de modo subentendido e termina por
Commit work (executa a efectivao da transaco corrente e comea uma nova) ou
Rollback work (aborta a transaco corrente)
O nvel de consistncia especificado pelo SQL-92 :
Serializvel
Read repetitivo
Read com efectivao
Read sem efectivao

13.9. TESTE DE SERIALIZAO


Nesta seco apresentaremos mtodos para determinar serializao de conflito (h
algoritmo simples) e serializao de viso.

13.9.1. TESTE PARA SERIALIZAO DE CONFLITO


Seja S uma escala. Construmos um grfico direccionado, chamado grfico de
precedncia de S. Esse grfico consiste num par G=(V,E), em que V um conjunto de
vrtices e E um conjunto de arestas. O conjunto de vrtices consiste em todas as
transaces que partiocipam na escala. O conjunto de arestas consiste em todas as
arestas Ti --> Tj para as quais uma das seguintes condies se verifica:
1.Ti executa write(Q) antes de Tj executar read(Q)
2.Ti executa read(Q) antes de Tj executar write(Q)
3.Ti executa write(Q) antes de Tj executar write(Q)

Se h uma aresta Ti --> Tj no grfico de precedncia, ento, em qualquer escala


sequencial S equivalente a S, Ti deve aparecer antes de Tj.

Se o grfico de precedncia tem um ciclo, ento a escala S no conflito serializvel.


Se o grfico no contm ciclos, ento a escala S conflito serializvel. A ordem de
serializao pode ser obtida por meio da classificao topolgica.

EXERCCIOS
13.1.Liste as propriedades ACID. Explique a utilidade de cada uma.
Atomicidade: Para garantir que uma transaco (com vrias operaes) ou
totalmente feita ou nada feito. Se assim no fosse corramos facilmente o risco de
inconsistncia de dados. Da responsabilidade do programador.
Consistncia: Para garantir que nada desaparece ou aparece sempre que feita
qualquer transaco. da responsabilidade do sistema de base de dados.
Isolamento: Apesar de duas transaces poderem ser executadas em simultneo,
para rendibilizar os recursos de sistema, para cada uma delas como se a outra no
existisse. da responsabilidade do sistema de controlo de concorrncia
Durabilidade: Depois de efectivada a transaco h que garantir que os dados se
mantm, mesmo que haja qualquer falha de sistema. Da responsabilidade do sistema
de recuperao.
13.2. Suponha que haja um sistema de banco de dados que nuca falhe. Um
gerenciador de recuperao necessrio para esse sistema?
No, uma vez que este responsvel pela recuperao de dados consistentes quando
h uma falha a meio de uma transaco que tem de ser pois abortada, ou de uma
falha mesmo aps a efectivao de uma transaco para garantir a durabilidade. Se
no h falhas, no se justifica este componente.
13.3. Considere o sistema de arquivo de seu sistema operativo favorito. Os aspectos
de atomicidade e durabilidade so relevantes em relao aos seguintes itens?
Justifique a sua resposta.
(a) Utilizador do sistema operativo
(b) Implementador do sistema de ficheiros.
(b) Sim. Por exemplo se o utilizador manda gravar um ficheiro para actualizao,
espera-se que o sistema grave/actualize a verso antiga totalmente, ou, se impossvel
por falha, que no faa nada, de modo a ter acessvel a verso antiga. Por outro lado,
quanto durabilidade tambm pois se se termina a operao (efectivao) que,
eventualmente, apaga verses anteriores, espera-se que essa verso se mantenha
para sempre.
(a) No. O utilizador no tem que se preocupar com isso.
13.4. Os implementadores de sistemas de banco de dados prestaram muito mais
ateno s propriedades ACID que os implementadores de sistemas de arquivo. Por
qu?
Porque uma base de dados, se no atender aquelas propriedades, rapidamente deixa
de ser fivel e os dados tornam-se completamente inconsistentes. Alm disso as
bases de dados jogam com grandes quantidades de informao interrelacionada e por
vezes sensvel e, onde, inconsistncias no so fceis de descobrir.
No caso dos sistemas de ficheiros embora possa ser produzida informao
inconsistente, muito mais fcil descobrir esse facto.
13.5. Durante a sua execuo, uma transaco atravessa vrios estados, at ser
finalmente efectivada ou abortada. Liste todas as possveis sucesses de estados
pelos quais uma transaco pode passar. Explique por que cada transio de estado
pode acontecer.
Activa estado inicial em execuo
parcialmente efectivada depois de a ltima operao j ter sido feita mas ainda em
memria. Daqui pode ir para abortada ou efectivada
efectivada Concluda, sem possibilidade de ser abortada
Em falha...
abortada Chegou-se concluso que a transaco no pode ser terminada. H que
recuperar os dados antigos e desfazer as operaes da transaco j realizadas.
13.6. Explique a distino entre os termos escala sequencial e escala serializvel
Escala sequencial quando as transaces se realizam uma a seguir outra. No h
concorrncia. Escala serializvel uma escala em que embora isso no se verifique,
os resultados so equivalentes a uma escala sequencial.
13.7. Considere as duas transaces seguintes:
T1: read(A);
read(B);
if A = 0 then B:= B+1;
write(B)
T2: read(B);
read(A);
if B = 0 then A:=A+1;
write(A)
Seja um requisito de consistncia A=0 V B=0, com valores iniciais A=B=0.
(a) Mostre que toda a execuo sequencial que envolve essas duas transaces
preserva a consistncia do banco de dados.
Se T1, T2, o resultado final B=1 e A=0 pois o if de T2 falso. Similarmente se T2,T1
o resultado final A=1 e B=0, pelo que a consistncia se preserva.
(b) Mostre uma execuo concorrente de T1 e T2 que produza uma escala no
serializvel
T1 T2
read(A)
read(B)
read(B)
read(A)
if B ...
write(A)
if A...
write(B)

Aqui a consistncia j no seria preservada pois ambas as transaces fazem as


leituras dos valores antes de qualquer outra operao, o que leva a que A e B sejam
zero nessas leituras e que vo depois ser alterados para 1.
A razo da no serializao que a escala no equivalente a nenhuma sequencial.
Pela disposio pode ver-se que nunca vou poder obter (por trocas sucessivas de
posio) uma escala sequencial visto que no posso trocar a ordem de write(A) de T2
por write(B) de T1 nem de read(A) de T1 por write(A) de T2
(c) H uma execuo concorrente de T1 e T2 que produza uma escala serializvel?
Sim porque o grfico de precedncia no contm ciclos

T1 --------> T2
ex:
read(B)
read(A)
read(A)
if A ...
write(B)
read(B)
if B...
write(A)
13.8. Dado que toda a escala conflito serializvel viso serializvel, por que
enfatizamos serializao de conflito em vez de serializao de viso?
Porque o algoritmo para testar a serializao de conflito muito mais simples.
13.9.
Considere o grfico de precedncia da figura. A escala correspondente conflito
serializvel? Justifique.
. O grfico de precedncia no tem ciclos.
13.10.

Você também pode gostar