O documento apresenta os principais conceitos relacionados ao controle de concorrência em bancos de dados. Discute como a execução concorrente de transações pode levar a inconsistências no banco de dados e define quatro tipos principais de anomalias: atualização perdida, leitura suja, leitura não repetível e tuplas fantasmas. Também apresenta os diferentes níveis de isolamento do padrão ANSI SQL e como eles tratam cada anomalia. Por fim, discute aspectos práticos da implementação dos níveis de isolamento em sistemas ger
1. BANCO DE DADOS II – GCC119
Controle de Concorrência
Versão dos slides: 0.773
Prof. Dr.-Ing. Leonardo Andrade Ribeiro
DCC-UFLA, Lavras
2. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Agenda
Introdução e Motivação
Teoria da Serializabilidade
Isolamento Baseado em Bloqueios
Controle de Concorrência e Recuperação
Isolamento Baseado em Timestamps
Isolamento Baseado em Múltiplas Versões
Deadlocks
2
3. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Isolamento e Consistência
Pelo princípio de corretude, temos que toda
transação quando executada de maneira isolada
(sem a execução concorrente de outras
transações), deixará o banco de dados em um
estado consistente
Portanto, se um conjunto de transações é
executado serialmente, isto é, uma transação de
cada vez, então cada transação receberá um
estado consistente de sua predecessora e o
resultado final será um banco de dados
consistente
3
4. Execução Serial
Podemos sempre garantir a corretude da
execução de um conjunto de transações
simplemente eliminado a concorrência
Tal medida pode ser adequada...
• se todos os programas apresentam tempo de
execução curto
• se todos os dados estão localizados na memória
principal
• se todos os dados são acessados por um único
processados
• se a própria lógica da aplicação não demanda
concorrência
4Existem muitos “ses” no cenário acima
5. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Concorrência entre Transações
Na maioria da vezes, é essencial que transações
possam executar de maneira concorrente por
questões de perfomance:
• Realização de processamento na CPU em paralelo com
operações de IO
− Evita que o processador fique ocioso enquanto um bloco é
lido da memória
• Intercalação de processamento entre transações
longas (isto é, transações cujo processamento pode
durar bastante tempo) e transações curtas
− Evita que transações curtas fiquem bloqueadas aguardando
o processamento de uma transação longa
5
6. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Concorrência vs. Consistência
Mesmo com o princípio de corretude, estados
temporários de inconsistência durante a
execução das operações de uma transação são
permitidos
Uma transação pode ter acesso a estados
intermediários inconsistentes causados por
outras transações
Por esse motivo, quando várias transações
executam concorrentemente, comportamento da
transação como um todo pode ser inconsistente
6
7. Controle de Concorrência
Princípio básico: execução concorrente não deve
causar mal funcionamento em programas de
aplicação
Garantido pela propriedade de Isolamento em ACID
Controle de concorrência é o problema a ser resolvido
para garantir Isolamento
Serializabilidade é a teoria que usamos para modelar
este problema
Bloqueios, timestamps, e múltiplas versões são as
técnicas, que baseadas na teoria de serializabilidade,
“atacam” o problema
Deadlocks são problemas colaterais decorrentes do
tratamento do controle de concorrência que também
precisam ser resolvidos
7
8. Problemas de Consistência: Intuição
Transações podem ser vistas como uma sequência de
ações de leitura e escrita sobre objetos do banco de
dados
Apenas ações de escrita mudam o estado de um objeto
Duas operações de leitura sobre um objeto realizadas por
transações diferentes não podem violar consistência
porque o estado do objeto não é modificado
Duas operações de escrita sobre um objeto realizadas
por uma mesma transação não podem violar
consistência porque, pelo princípio de corretude, as
ações de uma transação sempre mantêm a consistência
Apenas interações entre transações envolvendo pelo
menos uma operação de escrita sobre um mesmo objeto
do BD podem violar consistência
8
9. Anomalias
Grande parte dos problemas de consistência
causadas por concorrência podem
caracterizados através de quatro tipos de
anomalias:
• Atualizações perdidas (lost update)
• Leituras “sujas” (dirty read)
• Leitura não repetível (unrepeatable read)
• Tuplas “fantamas” (phantoms)
9
10. Atualização Perdida
Na sequência de abaixo, transação 𝑇1 modifica o
valor de 𝐴. Após isso, 𝑇2 também modifica o valor
de A antes do COMMIT de 𝑇1. Como resultado a
atualização feita por 𝑇1 é perdida
10
𝑇1 𝑇2 𝐴
𝑅𝐸𝐴𝐷(𝐴, 𝑡) 25
𝑅𝐸𝐴𝐷(𝐴, 𝑠) 25
𝑡 ← 𝑡 + 100 25
𝑠 ← 𝑠 − 20 25
𝑊𝑅𝐼𝑇𝐸(𝐴, 𝑡) 125
𝑊𝑅𝐼𝑇𝐸(𝐴, 𝑠) 5
tempo
11. Escrita Suja
O exemplo anterior ilustra uma atualização
perdida causada por uma escrita “suja”:
• escrita sobre um objeto que foi modificado
anteriormente por uma transação que ainda não
realizou o COMMIT
11
12. Atualização Perdida: Exemplo 2
12
𝑇1 𝑇2 𝐴
𝑅𝐸𝐴𝐷(𝐴, 𝑠) 25
𝑠 ← 𝑠 − 20 25
𝑅𝐸𝐴𝐷(𝐴, 𝑡) 25
𝑡 ← 𝑡 + 100 25
𝑊𝑅𝐼𝑇𝐸(𝐴, 𝑡) 125
𝐶𝑂𝑀𝑀𝐼𝑇 125
𝑊𝑅𝐼𝑇𝐸(𝐴, 𝑠) 5
Atualizações perdidas podem ocorrer mesmo
quando escritas sujas não ocorrem, como no
exemplo abaixo
tempo
13. Leitura Suja
Leitura suja ocorre quando uma transação lê
dados escritos por uma segunda transação
que ainda não realizou o COMMIT
Inconsistências podem ocorrer porque a
segunda transação pode:
• abortar subsequentemente
• ter deixado o banco em um estado
temporariamente inconsistente após a escrita
13
14. Leitura Suja: Exemplo 1
14
𝑇1 𝑇2 𝐴
𝑅𝐸𝐴𝐷(𝐴, 𝑠) 25
𝑠 ← 𝑠 − 20 25
𝑊𝑅𝐼𝑇𝐸(𝐴, 𝑠) 5
𝑅𝐸𝐴𝐷(𝐴, 𝑡) 5
𝑡 ← 𝑡 + 100 5
𝑊𝑅𝐼𝑇𝐸(𝐴, 𝑡) 105
𝐴𝐵𝑂𝑅𝑇 105
No exemplo abaixo, 𝑇1 lê o valor de 𝐴 escrito
por 𝑇2 e também atualiza esse valor.
Entretanto, após 𝑇2 abortar, o valor de 𝐴
escrito por 𝑇1 torna-se inconsistente
tempo
15. Leitura Suja: Exemplo 2
15
𝑇1 𝑇2 𝐴 𝐵 𝐶
𝑅𝐸𝐴𝐷(𝐴, 𝑡) 100 100 200
𝑡 ← 𝑡 − 50 100 100 200
𝑊𝑅𝐼𝑇𝐸(𝐴, 𝑡) 50 100 200
𝑅𝐸𝐴𝐷(𝐴, 𝑠) 50 100 200
𝑅𝐸𝐴𝐷(𝐵, 𝑢) 50 100 200
𝑝 ← 𝑠 + 𝑢 50 100 200
𝑊𝑅𝐼𝑇𝐸(𝐶, 𝑝) 50 100 150
𝑅𝐸𝐴𝐷(𝐵, 𝑡) 50 100 150
𝑡 ← 𝑡 + 50 50 100 150
𝑊𝑅𝐼𝑇𝐸(𝐵, 𝑡) 50 150 150
No exemplo abaixo, o valor de 𝐶 que representa a
soma dos valores de A e B torna-se inconsistente após
a segunda escrita de 𝑇1
16. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Leitura Não Repetível
Leitura não repetível ocorre quando uma
transação lê o valor de um objeto duas vezes
obtendo valores diferentes em cada leitura
16
17. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Leitura Não Repetível: Exemplo
No exemplo abaixo, 𝑇1 obtém valores
diferentes nas duas ações de leitura sobre 𝐴
17
𝑇1 𝑇2 𝐴
𝑅𝐸𝐴𝐷(𝐴, 𝑡) 5
𝑅𝐸𝐴𝐷(𝐴, 𝑠) 5
s ← 𝑠 − 5 5
𝑊𝑅𝐼𝑇𝐸(𝐴, 𝑠) 0
𝐶𝑂𝑀𝑀𝐼𝑇 0
𝑅𝐸𝐴𝐷(𝐴, 𝑡) 0
18. Seleção de Conjuntos de Objetos
Na discussão sobre as anomalias anteriores, transações
foram descritas como ações de leitura e escrita sobre
objetos individuais
Em um nível mais alto de abstração, transações são
especificadas através de uma linguagem para banco de
dados como SQL e conjuntos de tuplas são
selecionados para leitura ou modificação através da
especificação de predicados
Por exemplo, a consulta abaixo retorna um conjunto de
tuplas relacionadas com funcionários cujo salário é
maior que 5000
18
predicado
SELECT CPF, Nome
FROM Funcionarios
WHERE Salario > 5000
19. Tuplas “Fantamas” (Phantom)
Considere a seguinte sequência de ações:
• Transação 𝑇1 seleciona um conjunto de tuplas 𝐶1
usando um predicado 𝑃
• Transação 𝑇2 modifica o banco de dados inserindo,
deletando ou modificando um tupla que satisfaz 𝑃
• Transação 𝑇1 realizando outra seleção novamente
baseada em 𝑃 e obtém um conjunto de tuplas 𝐶2
Como resultado da sequência abaixo, teremos
uma anomalia onde 𝐶1 ≠ 𝐶2
Tuplas que podem “aparecer” ou “desaparecer”
no resultado de uma seleção são chamadas de
tuplas fantamas
19
20. Tuplas Fantasmas: Exemplo
No exemplo abaixo, a consulta de 𝑇1 sobre a
tabela Funcionarios irá retornar uma ou duas
tuplas, dependendo se a mesma é executada
antes ou depois da inserção realizada pela
transação 𝑇2
20
809333333
Nome
José Silva
João Rocha
Maria Ribeiro
CPF
111111111
122222222
Salario
9000
4000
3000
SELECT CPF, Nome
FROM Funcionarios
WHERE Salario > 5000
Funcionarios
𝑇1
INSERT INTO Funcionarios VALUES (‘333333’, ’Pedro Silva’, 6000)𝑇2
21. Níveis de Isolamento
do Padrão ANSI SQL
O padrão ANSI SQL define quatro níveis de isolamento:
• READ UNCOMMITTED
• READ COMMITTED
• REPEATABLE READ
• SERIALIZABLE
Cláusula SQL:
• SET TRANSACTION ISOLATION LEVEL “nível de isolamento”
Além disso, é possível informar se transação será
apenas de leitura ou de leitura e escrita
• SET TRANSACTION {READ ONLY | READ WRITE}
21
22. Níveis de Isolamento e Anomalias
Níveis de isolamento do padrão ANSI SQL
foram definidos à partir das anomalias leitura
suja, leitura não repetível e tuplas fantasmas
22
Nível Leitura Suja
Leitura Não
Repetível
Tuplas
Fantasmas
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
23. Níveis de Isolamento na Prática
Grande parte dos SGBDs não seguem
completamente o padrão ANSI SQL
• Considerável variação na terminologia
Atualizações perdidas são consideradas na prática
• A anomalia “escrita suja” é evitada em todos os níveis
para garantir recuperabilidade
• Muitos SGBDs implementam o nível de isolamento
chamado CURSOR STABILITY que evita atualizações
perdidas enquanto uma tupla estiver sob o cursor
• Entretanto, atualização perdidas só são
completamente evitadas a partir de REPEATABLE READ
23
24. Níveis de Isolamento na Prática (2)
Controle de concorrência baseado na técnica de
“snapshot” vem recebendo considerável adoção
• Esta técnica não garante isolação completa e é suscetível
às anomalias de tuplas fantasmas e write skew (esta
última anomalia será apresentada mais tarde)
• Nível de isolamento SNAPSHOT pode ser invocado
explicitamente em alguns SGBDs (ex.: MS SQL Server)
• Alguns SGBDs (ex.: Oracle 10g) usam (erradamente) a
técnica de snapshot para implementar o nível de
isolamento SERIALIZABLE
24
25. Níveis de Isolamento na Prática (3)
25
Nível
Escrita
Suja
Leitura
Suja
Atualização
Perdida
Leitura Não
Repetível
Write
Skew
Tuplas
Fantasmas
READ
UNCOMMITTED
Não Sim Sim Sim Sim Sim
READ
COMMITTED
Não Não Sim Sim Sim Sim
CURSOR
STABILITY
Não Não Talvez Talvez Talvez Sim
SNAPSHOT Não Não Não Não Sim Talvez
REPEATABLE
READ
Não Não Não Não Não Sim
SERIALIZABLE Não Não Não Não Não Não
Talvez = a anomalia é evitada em certas situações, mas em outras não
26. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Agenda
Introdução e Motivação
Teoria da Serializabilidade
Isolamento Baseado em Bloqueios
Controle de Concorrência e Recuperação
Isolamento Baseado em Timestamps
Isolamento Baseado em Múltiplas Versões
Deadlocks
26
27. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Exemplo de Duas Transações
27
𝑇1 𝑇2
𝑅𝐸𝐴𝐷(𝐴, 𝑡) 𝑅𝐸𝐴𝐷(𝐴, 𝑠)
𝑡 ← 𝑡 + 100 𝑠 ← 𝑠 ∗ 2
𝑊𝑅𝐼𝑇𝐸(𝐴, 𝑡) 𝑊𝑅𝐼𝑇𝐸(𝐴, 𝑠)
𝑅𝐸𝐴𝐷(𝐵, 𝑡) 𝑅𝐸𝐴𝐷(𝐵, 𝑠)
𝑡 ← 𝑡 + 100 𝑠 ← 𝑠 ∗ 2
𝑊𝑅𝐼𝑇𝐸(𝐵, 𝑡) 𝑊𝑅𝐼𝑇𝐸(𝐵, 𝑠)
Restrição de integridade: A = B
28. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Escalonamento
Definição: Um escalonamento é uma
sequência de ações realizadas por uma ou
mais transações ordenada em relação o
tempo de realização de cada atividade
28
29. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Escalonamento Serial
Definição: Um escalonamento é dito serial se
não existe intercalação entre operações de
diferentes transações
• As ações no escalonamento consistem em todas
as ações de uma transação, seguidos por todas
transações de outra transação e assim por diante
Temos 𝑛! escalonamentos seriais possíveis
para um conjunto de 𝑛 transações
29
30. Escalonamento Serial 1
30
𝑇1 𝑇2 𝐴 𝐵
𝑅𝐸𝐴𝐷(𝐴, 𝑡) 25 25
𝑡 ← 𝑡 + 100
𝑊𝑅𝐼𝑇𝐸(𝐴, 𝑡) 125
𝑅𝐸𝐴𝐷(𝐵, 𝑡)
𝑡 ← 𝑡 + 100
𝑊𝑅𝐼𝑇𝐸(𝐵, 𝑡) 125
𝑅𝐸𝐴𝐷(𝐴, 𝑠)
𝑠 ← 𝑠 ∗ 2
𝑊𝑅𝐼𝑇𝐸(𝐴, 𝑠) 250
𝑅𝐸𝐴𝐷(𝐵, 𝑠)
𝑠 ← 𝑠 ∗ 2
𝑊𝑅𝐼𝑇𝐸(𝐵, 𝑠) 250
S1: escalonamento serial possível para 𝑇1 e 𝑇2.
Note que o resultado final é consistente, isto é, 𝐴 = 𝐵
31. Escalonamento Serial 2
31
𝑇1 𝑇2 𝐴 𝐵
𝑅𝐸𝐴𝐷(𝐴, 𝑠) 25 25
𝑠 ← 𝑠 ∗ 2
𝑊𝑅𝐼𝑇𝐸(𝐴, 𝑠) 50
𝑅𝐸𝐴𝐷(𝐵, 𝑠)
𝑠 ← 𝑠 ∗ 2
𝑊𝑅𝐼𝑇𝐸(𝐵, 𝑠) 50
𝑅𝐸𝐴𝐷(𝐴, 𝑡)
𝑡 ← 𝑡 + 100
𝑊𝑅𝐼𝑇𝐸(𝐴, 𝑡) 150
𝑅𝐸𝐴𝐷(𝐵, 𝑡)
𝑡 ← 𝑡 + 100
𝑊𝑅𝐼𝑇𝐸(𝐵, 𝑡) 150
S2: outro escalonamento serial possível para 𝑇1 e 𝑇2. Note que o
resultado final é consistente, mas diferente do resultado de S1
32. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Escalonamento Serial
Pelo princípio de corretude de transações,
temos que todo escalonamento serial irá
preservar a consistência do BD
32
33. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Escalonamento Serializável
Definição: um escalonamento é dito
serializável se o efeito no BD causado por este
escalonamento é o mesmo efeito de algum
escalonamento serial
33
34. Escalonamento Serializável
34
𝑇1 𝑇2 𝐴 𝐵
𝑅𝐸𝐴𝐷(𝐴, 𝑡) 25 25
𝑡 ← 𝑡 + 100
𝑊𝑅𝐼𝑇𝐸(𝐴, 𝑡) 125
𝑅𝐸𝐴𝐷(𝐴, 𝑠)
𝑠 ← 𝑠 ∗ 2
𝑊𝑅𝐼𝑇𝐸(𝐴, 𝑠) 250
𝑅𝐸𝐴𝐷(𝐵, 𝑡)
𝑡 ← 𝑡 + 100
𝑊𝑅𝐼𝑇𝐸(𝐵, 𝑡) 125
𝑅𝐸𝐴𝐷(𝐵, 𝑠)
𝑠 ← 𝑠 ∗ 2
𝑊𝑅𝐼𝑇𝐸(𝐵, 𝑠) 250
E1 Escalonamento serializável, mas não serial. Note que o resultado
final é consistente, isto é A=B, e igual ao resultado de S1
36. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Notação para Leitura e Escrita
A seguir, iremos adotar uma notação simplicada
para ações de leitura e escrita:
• 𝑟1 𝐴 : objeto 𝐴 foi lido pela transação 𝑇1; por
simplicidade, considere que o valor de 𝐴 é armazenado
em um variável local também chamada 𝐴
• 𝑤1 𝐴 : variável local 𝐴 foi escrita pela transação 𝑇1
sobre um objeto também chamado 𝐴
Na maior parte da discussão, os valores concretos
lidos ou escritos por transações não são
importantes para o entendimento e serão omitidos
36
38. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Conceito de Conflito
Definição: Um par de ações em um
escalonamento estão em conflito se a alteração
da ordem das mesmas pode alterar o
comportamento de pelo menos uma das
transações envolvidas
Condição: quaisquer duas ações estão em
conflito se:
1. Estas ações pertencem à mesma transação, ou
2. As ações são pertencem à transações diferentes, e
2.1 envolvem o mesmo objeto do BD, e
2.2 pelo menos uma destas ações é uma escrita
38
39. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Conceito de Conflito
Dado um escalonamento 𝐸, ações
consecutivas que não estão em conflito
podem ser reordenadas gerando um novo
escalonamento 𝐸′
equivalente a 𝐸
39
𝐸: 𝑟1 𝐴 ; 𝑤1 𝐴 ; 𝑟2 𝐴 ; 𝒘 𝟐 𝑨 ; 𝒓 𝟏 𝑩 ; 𝑤1 𝐵 ; 𝑟2 𝐵 𝑤2 𝐵
𝐸′
: 𝑟1 𝐴 ; 𝑤1 𝐴 ; 𝑟2 𝐴 ; 𝒓 𝟏 𝑩 ; 𝒘 𝟐 𝑨 ; 𝑤1 𝐵 ; 𝑟2 𝐵 𝑤2 𝐵
ações não conflitantes
Exemplo:
equivalentes
40. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Escalonamentos
Equivalentes em Conflito
Definição: Dois escalonamentos são ditos
equivalentes em conflito se podemos
transformar um escalonamento no outro
através por uma sequência de trocas de
posições entre pares ações adjacentes que
não estejam em conflito
40
41. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Escalonamento
Serializável em Conflito
Definição: Um escalonamentos é dito
serializável em conflito se este escalonamento
é equivalente em conflito a algum
escalonamento serial
41
43. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Serializável vs.
Serializável em Conflito
Serializabilidade em conflito é uma condição
suficiente para serializabilidade, isto é, um
escalonamento que é serializável em confilto
também é serializável
Por outro lado, um escalonamento pode ser
serializável e, no entanto, não ser serializável
em confilto
43
44. Serializável vs.
Serializável em Conflito: Exemplo
Considerem o seguinte escalonamento serial:
• S3: 𝒓 𝟏 𝑨 ; 𝒘 𝟏 𝑨 ; 𝒘 𝟐 𝑨 ; 𝒘 𝟑 𝑨
Temos que o escalonamento E4 abaixo irá ter o mesmo
efeito que S3 e, portanto, é serializável:
• E4: 𝒓 𝟏 𝑨 ; 𝒘 𝟐 𝑨 ; 𝒘 𝟏 𝑨 ; 𝒘 𝟑 𝑨
• Intuitivamente, observe que o valor final de 𝐴 será pela
escrita da transação 𝑇3
Entretanto, não podemos converter E4 em S3 porque
todas ações adjacentes de E4 estão em confilto
Portanto, E4 não é serializável em conflito apesar de
ser serializável
44
45. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Conceito de Precedência
Dado um escalonamento 𝐸 envolvendo duas
transações 𝑇1 e 𝑇2, dizemos que 𝑇1 tem precedência
sobre 𝑇2, denotado por 𝑇1 < 𝑃 𝑇2, se existem ações
𝐴1 ∈ 𝑇1 e 𝐴2 ∈ 𝑇2 tal que:
• 𝐴1 aparece primeiro que 𝐴2 no escalonamento;
• 𝐴1 e 𝐴2 envolvem o mesmo objeto do BD;
• pelo menos 𝐴1 ou 𝐴2 é uma operação de escrita
Em outras palavras, transação 𝑇1 tem precedência
sobre transação 𝑇2 em um escalonamento 𝐸 se existe
uma ação 𝐴1 de 𝑇1 conflitante com uma ação 𝐴2 de
𝑇2 e 𝐴1 precede 𝐴2 em 𝐸
45
46. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Conceito de Precedência: Exemplo
Considere o simples escalonamento abaixo:
• 𝐸5: 𝒓 𝟏 𝑨 ; 𝑟2 𝐴 ; 𝑟1 𝐵 ; 𝒘 𝟐 𝑨
Temos que as ações 𝑟1 𝐴 e 𝑤2 𝐴 de 𝑇1 e 𝑇2,
respectivamente, são conflitantes
Como 𝑟1 𝐴 precede 𝑤2 𝐴 em 𝐸5, então
𝑇1 < 𝑃 𝑇2
46
47. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Grafo de Precedência
Podemos capturar o relacionamento de
precedência as transações de um escalonamento
através de um grafo de precedência
Dado um escalonamento 𝐸, o grafo de
precedência 𝐺 𝐸 de 𝐸 possui o conjunto de
vértices formado pelo conjunto de transações em
𝐸, onde o rótulo do vértice associado com a
transação 𝑇𝑖 é 𝑖. Existe uma aresta direcionada
entre quaisquer vértices 𝑖 e 𝑗 sse 𝑇𝑖 < 𝑃 𝑇𝑗
47
48. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Grafo de Precedência: Exercício
Construa o grafo de precedência para o
escalonamento abaixo:
48
𝐸6: 𝑟2 𝐴 ; 𝑟1 𝐵 ; 𝑤2 𝐴 ; 𝑟3 𝐴 ;𝑤1 𝐵 ; 𝑤3 𝐴 ; 𝑟2 𝐵 ; 𝑤2 𝐵
49. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Exercício: Resposta
Vamos considerar a primeira escrita, 𝑤2 𝐴 , realizada
pela transação 𝑇2
Temos que nenhuma transação além de 𝑇2 leu ou
escreveu o objeto 𝐴 antes dessa ação; por outro lado,
temos a leitura 𝑟3 𝐴 e a escrita 𝑤3 𝐴 da transação 𝑇3
em 𝐴 após essa ação
Portanto, o grafo de precedência parcial de E6 será:
49
1 2 3
𝐸6: 𝑟2 𝐴 ; 𝑟1 𝐵 ; 𝒘 𝟐 𝑨 ; 𝑟3 𝐴 ; 𝑤1 𝐵 ; 𝑤3 𝐴 ; 𝑟2 𝐵 ; 𝑤2 𝐵
50. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Exercício: Resposta (2)
Vamos considerar agora a segunda escrita, 𝑤1 𝐵 ,
realizada pela transação 𝑇1
Temos que nenhuma transação além de 𝑇1 leu ou
escreveu o objeto 𝐴 antes dessa ação; por outro lado,
temos a leitura 𝑟2 𝐵 e a escrita 𝑤2 𝐵 da transação
𝑇2 em 𝐵 após esta ação
Portanto, o grafo de precedência parcial de E6 será:
50
1 2 3
𝐸6: 𝑟2 𝐴 ; 𝑟1 𝐵 ; 𝑤2 𝐴 ; 𝑟3 𝐴 ; 𝒘 𝟏 𝑩 ; 𝑤3 𝐴 ; 𝑟2 𝐵 ; 𝑤2 𝐵
51. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Exercício: Resposta (3)
Vamos considerar a terceira escrita, 𝑤3 𝐴 ,
realizada pela transação 𝑇3
A relação de precedência 𝑇2 < 𝑃 𝑇3 devido ao
objeto 𝐴 já está representada no grafo.
Observando as operações após 𝑤3 𝐴 , temos
que nenhuma transação lê ou escreve 𝐴 após
esta operação.
O grafo de precedência permance, portanto,
inalterado
51
𝐸6: 𝑟2 𝐴 ; 𝑟1 𝐵 ; 𝑤2 𝐴 ; 𝑟3 𝐴 ; 𝑤1 𝐵 ; 𝒘 𝟑 𝑨 ; 𝑟2 𝐵 ; 𝑤2 𝐵
52. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Exercício: Resposta (4)
Finalmente, consideramos a operação, 𝑤2 𝐵 ,
realizada pela operação 𝑇2
A relação de precedência 𝑇1 < 𝑃 𝑇2 devido ao
objeto B já está representada no grafo e não
existem outras operações após 𝑤2 𝐵
Portanto o grafo de precedência final será:
52
1 2 3
𝐸6: 𝑟2 𝐴 ; 𝑟1 𝐵 ; 𝑤2 𝐴 ; 𝑟3 𝐴 ; 𝑤1 𝐵 ; 𝑤3 𝐴 ; 𝑟2 𝐵 ; 𝒘 𝟐 𝑩
53. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Grafo de Precedência e
Serializabilidade em Conflito
O grafo de precedência de um escalonamento
serializável em conflito não possui ciclos
Além disso, qualquer ordem topológica do
grafo de precedência de um escalonamento
serializável em conflito representa um
escalonamento serial equivalente em conflito
53
54. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Exercício
Considere o escalonamento abaixo:
Construa o grafo de precedência para E7
Este escalonamento é serializável em conflito?
54
𝐸7: 𝑟2 𝐴 ; 𝑟1 𝐵 ; 𝑤2 𝐴 ; 𝑟2 𝐵 ; 𝑟3 𝐴 ; 𝑤1 𝐵 ; 𝑤3 𝐴 ; 𝑤2 𝐵
55. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Exercício: Resposta
Não, pois o grafo de precedência
correspondente apresenta um ciclo
55
1 2 3
56. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Serializabilidade em Visão
Como já mencionado, serializabilidade em
conflito é uma condição suficiente mas não
necessária para serializabilidade
Uma condição suficiente e mais geral para
serializabilidade é a chamada serializabilidade
em visão
56
57. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Escalonamentos
Equivalentes em Visão
Dois escalonamentos 𝐸1 e 𝐸2 sobre o mesmo
conjunto de transações são equivalentes em visão
se as três condições abaixo são satisfeitas:
1. Se 𝑇𝑖 lê o valor inicial do objeto 𝐴 em 𝐸1, então 𝑇𝑖
também deve ler o valor de inicial de 𝐴 em 𝐸2
2. Se 𝑇𝑖 lê o valor de 𝐴 escrito por 𝑇𝑗 em 𝐸1, então 𝑇𝑖
também deve ler o valor de 𝑇𝑗 em 𝐸2
3. Para cada objeto 𝐴, se existe uma transação 𝑇𝑖 que
realiza a última escrita sobre 𝐴 em E1, então 𝑇𝑖
também deve realizar a última escrita sobre 𝐴 em E2
57
58. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Escalonamento
Serializável em Visão
Definição: Um escalonamentos é dito serializável
em visão se este escalonamento é equivalente
em visão a algum escalonamento serial
58
59. Escalonamento
Serializável em Visão: Exemplo
Considere novamente o escalonamento serial S3 e o
escalonamento E4:
• S3: 𝑟1 𝐴 ; 𝑤1 𝐴 ; 𝑤2 𝐴 ; 𝑤3 𝐴
• E4: 𝑟1 𝐴 ; 𝑤2 𝐴 ; 𝑤1 𝐴 ; 𝑤3 𝐴
Temos que S3 e E4 são equivalentes em visão:
1. 𝑇1 lê o valor inicial de A em S3 e em E4
2. Nenhuma transação em S3 e em E4 lê o valor escrito por
outra transação
3. 𝑇3 escreve o valor final de A em S3 e em E4
Portanto, E4 é serializável em visão
Notem que E4 não é serializável em conflito
• Todo escalonamento serializável em conflito também é
serializável em visão, mas o oposto não é verdadeiro
59
60. Serializabilidade Em Visão
na Prática
Apesar de permitir uma condição mais geral
para testes de serializabilidade que
serializabilidade em conflito, a aplicação do
conceito de serializabilidade em visão é
bastante custosa computacionalmente
• Pouca utilidade na prática
60
61. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Agenda
Introdução e Motivação
Teoria da Serializabilidade
Isolamento Baseado em Bloqueios
Controle de Concorrência e Recuperação
Isolamento Baseado em Timestamps
Isolamento Baseado em Múltiplas Versões
Deadlocks
61
62. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Isolamento Usando Bloqueios (Locks)
Bloqueios é um conceito importante para
garantir serilizabilidade de escalonamentos
Intuitivamente, uma transação dever obter
um bloqueio (lock) sobre um objeto do BD
antes de realizar ações de leitura ou escrita
sobre esse objeto
O uso de bloqueios impõe restrições de
consistência na estrutura de transações e
escalonamentos
62
63. Isolamento Usando Bloqueios (Locks)
Transações:
1. Uma transação pode apenas ler ou escrever um objeto se
a mesma já possui um bloqueio sobre este objeto e ainda
não o liberou ainda
2. Se uma transação bloqueia um objeto, a mesma deve
libera-lo mais tarde
Escalonamentos:
1. Duas transações não podem manter bloqueios
incompatíveis sobre o mesmo objeto ao mesmo tempo
2. Caso a requisição de bloqueio sobre um objeto não possa
ser atendida, por exemplo, porque este objeto já se
encontra bloqueado por uma segunda transação, então a
transação requisitante deverá aguardar até que essa
segunda transação libere o bloqueio
63
64. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Bloqueios: Notação
Inicialmente, vamos considerar primeiramente
bloqueios de leitura e escrita
• Outros tipos de bloqueio serão vistos mais tarde
Bloqueio de leitura ou compartilhado (shared lock)
• 𝒔𝒊 𝑨 : Transação 𝑇𝑖 possui um bloqueio de leitura sobre
o objeto 𝐴
Bloqueio de escrita ou exclusivo (exclusive lock)
• 𝒙𝒊 𝑨 : Transação 𝑇𝑖 possui um bloqueio de escrita sobre
o objeto 𝐴
Liberação de bloqueio (unlock)
• 𝒖𝒊 𝑨 : Transação 𝑇𝑖 liberou o bloqueio (de leitura ou
escrita) sobre o objeto 𝐴
64
65. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Consistência de Transações
Regras para consistência de transações:
1. Uma ação de leitura 𝑟𝑖 𝐴 deve ser precedida
por 𝑠𝑖 𝐴 ou 𝑥𝑖 𝐴 sem qualquer 𝑢 𝐴
interposto entre as mesmas
2. Um ação de escrita 𝑤𝑖 𝐴 deve ser precedida
por 𝑥𝑖 𝐴 sem qualquer sem qualquer 𝑢 𝐴
interposto entre as mesmas
3. Todos operações 𝑠𝑖 𝐴 ou 𝑥𝑖 𝐴 devem ser
sucedidas em algum momento por uma
operação 𝑢 𝐴
65
66. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Legalidade de Escalonamentos
Regras para legalidade de escalonamentos:
1. Se 𝑥𝑖 𝐴 aparece em um escalonamento, então
não pode existir um 𝑥𝑗 𝐴 ou 𝑠𝑗 𝐴 , para 𝑗 ≠ 𝑖,
sem que exista um 𝑢 𝐴 interposto
2. Se 𝑠𝑖 𝐴 aparece em um, então não pode existir
um 𝑥𝑗 𝐴 , para 𝑗 ≠ 𝑖, sem que exista um 𝑢 𝐴
interposto
66
67. Matriz de Compatibilidade
67
𝑠 𝑥
𝑠 Sim Não
𝑥 Não Não
Bloqueio
vigente
Bloqueio requisitado
• Uma matriz de compatibilidade possui uma linha e
uma coluna para cada tipo de lock. As linhas
correspondem a bloqueios que já existem sobre um
objeto e as colunas correspondem a bloqueios
requisitados por outras transações
• Os valores nas células indicam se a transação
requisitante podem obter o o bloqueio
68. Bloqueios: Exemplo
No exemplo abaixo, a transação 𝑇2 tem que aguardar até
que 𝑇1 libere o bloqueio de escrita sobre 𝐵
68
𝑇1 𝑇2
𝑠1 𝐴
𝑟1 𝐴
𝐵 ← 𝐴 + 100 𝑠2 𝐴
𝑢1 𝐴 𝑟2 𝐴
𝑥1 𝐵 𝑢2 𝐴
𝑤1 𝐵 𝑠2 𝐵 Negado!
𝑢1 𝐵 𝑇2 em espera
𝑠2 𝐵
𝑟2 𝐵
69. Bloqueios: Exemplo 2
69
𝑇1 𝑇2 𝐴 𝐵
𝑥1 𝐴 , 𝑟1 𝐴 25 25
𝐴 ← 𝐴 + 100 𝑥2 𝐴 Negado!
𝑤1 𝐴 ; 𝑢1 𝐴 𝑇2 em espera 125
𝑥2 𝐴 ; 𝑟2 𝐴
𝐴 ← 𝐴 ∗ 2
𝑤2 𝐴 , 𝑢2 𝐴 250
𝑥2 𝐵 , 𝑟2 𝐵
𝑥1 𝐵 Negado! B ← 𝐵 ∗ 2
𝑇1 em espera 𝑤2 𝐵 , 𝑢2 𝐵 50
𝑥1 𝐵 ; 𝑟1 𝐵
B ← 𝐵 + 100
𝑤1 𝐵 , 𝑢1 𝐵 150
E2‘: Escalonamento válido usando bloqueios mas não serializável. Note
que o resultado final é inconsistente, isto é 𝐴 ≠ 𝐵
70. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Bloqueio em Duas Fases
( Two-phase Locking, 2PL)
2PL: protocolo para aquisição e liberação de
bloqueios
Principio básico: em toda transação, todos as
requisições por bloqueios precedem as
requisições por unlock
Fase de expansão: bloqueios são adquiridos
mas não liberados
Fase de retração: bloqueis são liberados e
nenhum novo bloqueio é adquirido
70
71. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Protocolo 2PL: Definição Formal
Um protocolo é dito 2PL se em qualquer transação
𝑇𝑖, nenhuma ação 𝑠𝑖 𝐴 ou 𝑥𝑖 𝐴 pode ser precedida
por uma ação 𝑢 𝐵 para qualquer 𝐴 e qualquer 𝐵
71
72. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
2PL e Serializabilidade em Conflito
Se um escalonamento 𝐸 é composto apenas
por transações que obedecem o protocolo
2PL, então 𝐸 é serializável em conflito
• Um escalonamento serial equivalente em conflito
com 𝐸 pode ser obtido através pelo ordenamento
das transações de 𝐸 baseando-se nas primeiras
requisições de unlock de cada transação
72
74. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Upgrade e Downgrade
de Bloqueios
Upgrade de bloqueio: Uma transação mantendo um
bloqueio de leitura pode converte-lo em um bloqueio de
escrita sem ter que liberar o bloqueio original primeiro
• 𝑇𝑖: 𝑠𝑖 𝐴 → 𝑥𝑖 𝐴
Downgrade de bloqueio: Uma transação mantendo um
bloqueio de escrita pode converte-lo em um bloqueio de
leitura sem ter que liberar o bloqueio original primeiro
• 𝑇𝑖: 𝑥𝑖 𝐴 → 𝑠𝑖 𝐴
Upgrade e downgrade de bloqueios pode aumentar a
concorrência entre transações
• Transações podem permanecer mais tempo com o bloqueio de
leitura que permite o acesso compartilhado a objetos do BD
74
75. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Upgrade e Downgrade de
Bloqueios em Transações 2PL
Em uma transação 2PL, upgrade de bloqueios
só é permito na fase de expansão, ao passo
que downgrade de bloqueios só é permitido
na fase de retração
75
76. Upgrade e Downgrade de
Bloqueios: Exemplo
No escalonamento abaixo, a computação de 𝑇1 e
𝑇2 não poderia ser realizada de maneira
concorrente se 𝑇1 tivesse obtido diretamente um
bloqueio exclusivo sobre 𝐵
76
𝑇1 𝑇2
𝑠1 𝐴 , 𝑟1 𝐴
𝑠1 𝐵 , 𝑟1 𝐵
𝑠2 𝐴 , 𝑟2 𝐴
𝑠2 𝐵 , 𝑟2 𝐵
𝑢2 𝐴 , 𝑢2 𝐵
𝑥1 𝐵 , 𝑟1 𝐵 , 𝑤1 𝐵
𝑢1 𝐴 , 𝑢1 𝐵
77. Objetos de Diferentes
Granularidades
Objetos do BD podem ser definidos em diferentes
granularidades, relacionados entre si de maneira
hierárquica:
• Ex.: relações → blocos → tuplas
É desejável que protocolos de bloqueio explorem estes
diferentes níveis de granularidade e a hierarquia
subjacente
77
relação
bloco 1 bloco 2
tupla 1 tupla 2 tupla 3 tupla 4
Representação gráfica
em forma de árvore
dos objetos de um BD
78. Bloqueios com
Diferentes Granularidades
Considere um banco de dados de um sistema bancário,
onde as informações da cada conta bancária são
mantidas na relação “Conta”
Se relações são tratadas como objetos básicos do BD,
então qualquer transação que for alterar o saldo
bancário de um cliente terá que bloquear toda a
relação “Conta”
• Consequentemente, teriamos acesso serial sobre “Conta”
e a concorrência entre as transações seria
consideravelmente reduzida
Uma melhor estratégia para aumentar a concorrência
seria realizar bloqueios sobre objetos de menor
granularidade como blocos ou tuplas
78
79. Bloqueios com
Diferentes Granularidades (2)
Por outro lado, no caso de transações que irão
acessar uma grande parcela das tuplas de
relação (por exemplo, uma transação que
debita taxas bancárias de cada conta no
começo do mês), será custoso manter um
bloqueio para cada tupla acessada
Neste caso, é preferível obter um único
bloqueio sobre toda a relação “Conta”
79
80. Bloqueios sobre
Hierarquias de Objetos
Para podermos realizar bloqueios sobre objetos
organizados de maneira hierárquica, é necessário uma
maneira para “navegar” entre os vértices que representam
os objetos
• Precisamos mover na árvore no sentido raiz-folha para obter
bloqueios cada vez mais refinados
• Precisamos mover na árvore no sentido folha-raiz para liberar os
bloqueios
De maneira geral, um bloqueio explícito sobre um vértice 𝑣
resulta em bloqueios implícitos sobre todos os vértices da
subárvore enraizada por 𝑣 do mesmo tipo que o bloqueio
explícito (escrita ou leitura)
Um transação pode apenas realizar açoes sobre um objeto
representado pelo vértice 𝑣 após obter um bloqueio
explícito sobre 𝑣
80
81. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Bloqueios de Intenção
Um bloqueio de intenção sobre 𝑣 representa a
“intenção” de realizar uma ação sobre um dos
nós da subárvore enraizada por 𝑣
Usados para navegar na árvore de objetos de
múltiplas granularidades:
• Bloqueios de intenção devem ser obtidos sobre
todos vértices ancestrais (isto é, o caminho do
vértice pai até a raiz da árvore) do vértice sobre o
qual pretende-se obter o bloqueio explícito
81
82. Tipos de Bloqueios de Intenção
Bloqueio de intenção de leitura (intention shared lock):
• 𝑖𝑠(𝑣): bloqueio de leitura explícito será realizado sobre
algum vértice da subárvore enraizada por 𝑣
Bloqueio de intenção de escrita (intention exclusive lock):
• 𝑖𝑥(𝑣): bloqueio de escrita explícito será realizado sobre
algum vértice da subárvore enraizada por 𝑣
Bloqueio de leitura e de intenção de escrita (shared and
intention exclusive lock):
• 𝑠𝑖𝑥(𝑣): bloqueio de leitura explícito sobre 𝑣 e um bloqueio
de escrita explícito será realizado sobre algum vértice dessa
subárvore
82
83. Bloqueios de Intenção: Exemplos
83
𝑖𝑠
𝑖𝑠
𝑠
Sequência de bloqueios de
intenção de leitura até a
obtenção de um bloqueio
(explícito) de leitura
𝑖𝑥
𝑥
Sequência de bloqueios de
intenção de escrita até a
obtenção de um bloqueio
(explícito) de escrita
𝑠𝑖𝑥
𝑠𝑖𝑥
𝑥
Sequência de bloqueios de
leitura e intenção de escrita até
a obtenção de um bloqueio
(explícito) de escrita.
84. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Bloqueios de Intenção:
Matriz de Compatibilidade
84
𝑖𝑠 𝑖𝑥 𝑠 𝑠𝑖𝑥 𝑥
𝑖𝑠 Sim Sim Sim Sim Não
𝑖𝑥 Sim Sim Não Não Não
𝑠 Sim Não Sim Não Não
𝑠𝑖𝑥 Sim Não Não Não Não
𝑥 Não Não Não Não Não
Matriz de compatibilidade contendo bloqueios de
intenção e bloqueios regulares
85. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Bloqueios de Aviso: Regras
Para que uma transação 𝑇𝑖 obtenha um bloqueio sobre
um vértice 𝑣, as seguintes regras devem ser
obedecidas:
1. 𝑇𝑖 deve bloquear primeiramente a raiz da árvore;
qualquer tipo de bloqueio pode ser usado
2. 𝑇𝑖 pode bloquear 𝑣 em modo 𝑠 ou 𝑖𝑠 somente se𝑇𝑖 já
possui o bloqueio do pai de de 𝑣 em modo 𝑖𝑠 ou 𝑖𝑥
3. 𝑇𝑖 pode bloquear 𝑣 em modo 𝑥, 𝑖𝑥 e 𝑠𝑖𝑥 somente se 𝑇𝑖
possui o bloqueio do pai de 𝑣 em 𝑖𝑥 e 𝑠𝑖𝑥
4. 𝑇𝑖 pode bloquear 𝑣 se a mesma ainda não desbloqueou
nenhum vértice (isto é, 𝑇 é 2PL)
5. Uma transação pode desbloquear um vértice se a mesma
não possui bloqueios sobre nenhum de seus filhos
85
86. Bloqueios de Intenção em
Escalonamentos
Considere um escalonamento formado pelas transações 𝑇1 e 𝑇2:
• 𝑇1: SELECT * FROM Alunos WHERE ID=2222 OR ID=4444
• 𝑇2: UPDATE Alunos SET fone=9192 WHERE ID=3333
A sequência de bloqueios sobre os objetos nas granularidades
relação, bloco e tupla é ilustrada abaixo
86
Alunos
𝑇1: 𝑖𝑠
ID=2222 ID=3333𝑇1: s 𝑇2: 𝑥
Bloco 1 Bloco 2
ID=4444𝑇1: s
𝑇2: 𝑖𝑥
𝑇1: 𝑖𝑠
𝑇1: 𝑖𝑠
𝑇2: 𝑖𝑥
87. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Evitando Tuplas Fantasmas
Considere uma transação 𝑇 que seleciona um conjunto de tuplas de
uma tabela 𝐴 usando um predicado 𝑃
Uma maneira direta de se evitar tuplas fantasmas é obter um
bloqueio do tipo 𝑥 sobre 𝐴
• Com isso, tuplas não podem ser inseridas ou deletadas
Entretanto, esta abordagem limita bastante a concorrência porque
mesmo inserções ou deleções que não são relacionadas com 𝑃
serão impedidas
Uma solução mais sofisticada consiste em usar um índice definido
sobre um atributo em 𝑃
• O índice sempre é atualizado quando uma tupla é inserida ou deletada
• Obtendo bloqueios somente sobre sobre páginas do índice contendo
tuplas que satisfazem 𝑃 permite evitar tuplas fantasmas sem eliminar
a inserção ou deleção de tuplas não relacionadas com 𝑃
Esta técnica é conhecida como bloqueio de índice (index locking) e
é um caso especial de um conceito mais geral para bloqueio de
predicados (predicate locking)
87
88. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Agenda
Introdução e Motivação
Teoria da Serializabilidade
Isolamento Baseado em Bloqueios
Controle de Concorrência e Recuperação
Isolamento Baseado em Timestamps
Isolamento Baseado em Múltiplas Versões
Deadlocks
88
89. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Escalonamentos Envolvendo
Transações que Abortaram
Até o momento na discussão, consideramos apenas as
ações de transações, mas ignoramos se as mesmas irão
concluir com sucesso ou abortar
Como já mencionado na discussão sobre recovery, quando
se uma transação aborta podemos ter problemas para
recuperar o estado consistente do BD caso outras
transações já tenham realizados ações conflitantes com
essa transação
• Neste caso, podemos ter a situação onde um escalonamento,
mesmo serializável, produz uma sequência de registros no log
que é recuperável
Para tratar este problema, vamos estender a notação para
consideramos ações de COMMIT e ABORT
• 𝑐1: transação 𝑇1 realizou COMMIT
• 𝑎1: transação 𝑇1 realiou ABORT
89
90. Escalonamento
Não Recuperável: Exemplo
90
𝑇1 𝑇2 A Log
100 𝑆𝑇𝐴𝑅𝑇, 𝑇1
𝑥1 𝐴 , 𝑟1 𝐴 𝑆𝑇𝐴𝑅𝑇, 𝑇2
𝐴 ← 𝐴 − 20 𝑥2 𝐴 Negado!
𝑤1 𝐴 , 𝑢1 𝐴 80 𝑇1, 𝐴, 100,80
𝑥2 𝐴 , 𝑟2 𝐴
𝐴 ← 𝐴 ∗ 2
𝑤2 𝐴 , 𝑢2 𝐴 160 𝑇2, 𝐴, 80,160
𝑐2 𝐶𝑂𝑀𝑀𝐼𝑇, 𝑇2
𝑎1 𝐴𝐵𝑂𝑅𝑇, 𝑇1
Após 𝑇1 realizar o ABORT, o processo de recovery é acionado para
desfazer sua ação no BD. O undo de 𝑇1 faz com que a ação de 𝑇2
também seja desfeita. Entretanto, isto não pode ocorrer porque 𝑇2
já realizou o COMMIT e suas ações no BD devem ser duráveis
91. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Escalonamento Recuperáveis
Escalonamento recuperável: um
escalonamento é recuperável se cada
transação 𝑇 realiza o COMMIT apenas depois
que todas transações que escreveram dados
lidos por 𝑇 tenham realizado o COMMIT
Neste contexto, se uma transação 𝑇1 aborta,
então todas transações que leram dados
escritos por 𝑇1 também devem abortar
91
92. Escalonamento
Não Recuperável: Exemplo
92
𝑇1 𝑇2 A Log
100 𝑆𝑇𝐴𝑅𝑇, 𝑇1
𝑥1 𝐴 , 𝑟1 𝐴 𝑆𝑇𝐴𝑅𝑇, 𝑇2
𝐴 ← 𝐴 − 20 𝑥2 𝐴 Negado!
𝑤1 𝐴 , 𝑢1 𝐴 80 𝑇1, 𝐴, 100,80
𝑥2 𝐴 , 𝑟2 𝐴
𝐴 ← 𝐴 ∗ 2
𝑤2 𝐴 , 𝑢2 𝐴 160 𝑇2, 𝐴, 80,160
𝑎1 𝐴𝐵𝑂𝑅𝑇, 𝑇1
𝑎2 𝐴𝐵𝑂𝑅𝑇, 𝑇2
Agora o ABORT de 𝑇1 faz com que 𝑇2 seja abortada
93. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Escalonamentos Recuperáveis vs.
Escalonamentos Serializáveis
Recuperabilidade e Serializabilidade são conceitos
ortogonais
Exemplo de escalonamento serializável e recuperável
• 𝐸7: 𝑤1 𝐴 ; 𝑤1 𝐵 ; 𝑤2 𝐴 ; 𝑟2 𝐵 ; 𝑐1; 𝑐2
Exemplo de escalonamento recuperável mas não
serializável
• 𝐸8: 𝑤2 𝐴 ; 𝑤1 𝐵 ; 𝑤1 𝐴 ; 𝑟2 𝐵 ; 𝑐1; 𝑐2
• Notem que todas todas operações de 𝐸8 estão em conflito
Exemplo de escalonamento serializável mas não
recuperável
• 𝐸9: 𝑤1 𝐴 ; 𝑤1 𝐵 ; 𝑤2 𝐴 ; 𝑟2 𝐵 ; 𝑐2; 𝑐1
• Notem que 𝑇2 realiza o COMMIT antes de 𝑇1
93
94. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
ABORT em Cascata
Como jé mencionado, quando um transação 𝑇
aborta, todas as transações que 𝑈1, … , 𝑈 𝑛 que
leram valores escritos por 𝑇 devem abortar
Por sua vez, todas transações 𝑉1, … , 𝑉𝑛 que
leram valores escritos pelas transações
𝑈1, … , 𝑈 𝑛 também devem abortar e assim por
diante
Este comportamento é chamado ABORT
(ROLLBACK) em cascata
94
95. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
ABORT em Cascata: Exemplo
95
𝑇1 𝑇2 𝑇3 𝑇4
𝑤1 𝐴
𝑟2 𝐴
𝑤2 𝐵
𝑟3 𝐵
𝑤3 𝐶
𝑟4 𝐶
𝑎1
𝑎2
𝑎3
𝑎4
O ABORT de 𝑇1 faz com que 𝑇2, 𝑇3 e 𝑇4 sejam abortadas
96. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Escalonamentos que Evitam
ABORT em Cascata
Um escalonamento evita ABORT em cascata
(EAC) se transações podem ler apenas valores
de transações que já realizaram o COMMIT
• Em outras palavras, um escalonamento é dito
recuperável se o mesmo não permite leituras
sujas
Claramente, todo escalonamento EAC
também é recuperável
96
97. Problemas com Escrita Suja
No exemploa acima, o gerenciador de recovery não pode
realizar o “undo” das ações de 𝑇1 porque senão a ação de 𝑇2
será desfeita
Por outro lado, se as modificações de 𝑇1 não forem desfeitas
e𝑇2 abortar subsequentemente, então não será possível
retornar o valor original de 𝐴
97
𝑇1 𝑇2 A Log
𝑠1 𝐴 , 𝑟1 𝐴 100
𝐴 ← 𝐴 − 20
𝑥1 𝐴 , 𝑤1 𝐴 𝑇1, 𝐴, 100,80
𝑢1 𝐴 𝐴 ← 160 80
𝑥2 𝐴 , 𝑤2 𝐴 160 𝑇2, 𝐴, 80,160
𝑎1 𝐴𝐵𝑂𝑅𝑇, 𝑇1
98. Bloqueios Longos e Curtos
Para solucionar o problema com escritas sujas,
vamos introduzir os conceitos de bloqueios
longos e curtos
Bloqueio longo: um bloqueio é dito longo se o
mesmo é mantido até que a transação realize
o COMMIT ou ABORT
Bloqueio curto: um bloqueio é dito curto se o
mesmo é liberado antes que a transação
realize o COMMIT ou ABORT
98
99. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Protocolo 2PL Estrito
Um protocolo é dito 2PL se em qualquer transação 𝑇𝑖,
nenhuma ação 𝑠𝑖 𝑋 ou 𝑥𝑖 𝑋 pode ser precedida por
uma ação 𝑢 𝑌 para qualquer 𝑌 e todos bloqueios de
escrita são longos
Escalonamentos apenas com transações seguindo
o protocolo 2PL estrito são chamadados bloqueio
estrito são chamados escalonamentos 2PL
estritos
Todo escalonamento 2PL estrito é serializável e
EAC
• O escalonamento é serializável por ser 2PL
• O escalonamento é EAC porque leituras sujas não são
possíveis
99
100. Escalonamento 2PL Estrito
Agora 𝑇2 só obtém o bloqueio de escrita sobre 𝐴
após 𝑇1 abortar e, consequentemente, liberar o
bloqueio
100
𝑇1 𝑇2 A Log
𝑠1 𝐴 , 𝑟1 𝐴 100
𝐴 ← 𝐴 − 20 𝑟2 𝐴 , 𝑟2 𝐴
𝑥1 𝐴 , 𝑤1 𝐴 𝐴 ← 𝐴 ∗ 2 𝑇1, 𝐴, 100,80
𝑎1 𝐴𝐵𝑂𝑅𝑇, 𝑇1
𝑥1 𝐴 , 𝑤1 𝐴 160 𝑇2, 𝐴, 80,160
101. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Relacionamento entre Classes de
Escalonamentos
101
Serializável
RecuperávelEAC
2PL Estrito
Serial
102. Níveis de Isolamento SQL e
Bloqueios
A tabela mostra uma possível estratégia para
implementação dos nívéis de isolamento SQL suando
bloqueios
Notem que todos níveis evitam escritas sujas
Escalamentos recuperáveis e EAC são garantidos a partir do
nível READ COMMITED 102
Nível
Bloqueio de
leitura
Bloqueios de
Escrita
Bloqueio de
Predicados
READ UNCOMMITTED Não Sim, Longos Não
READ COMMITTED Sim, Curtos Sim, Longos Não
REPEATABLE READ Sim, Longos Sim, Longos Não
SERIALIZABLE Sim, Longos Sim, Longos Sim
103. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Agenda
Introdução e Motivação
Teoria da Serializabilidade
Isolamento Baseado em Bloqueios
Controle de Concorrência e Recuperação
Isolamento Baseado em Timestamps
Isolamento Baseado em Múltiplas Versões
Deadlocks
103
104. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Controle de Concorrência
usando Timestamps
Neste tipo de controle de concorrência, um
“timestamp“ (registro do tempo) é associado
com cada transação
Timestamps de transações que realizaram
leitura ou escrita de cada objeto do BD são
também registrados
Usando estes timestamps é possível assegurar
que o escalonamento das transações será
equivalente ao escalonamento serial definido
pelo timestamps das transações
104
105. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Timestamps de Transações
Um timestamp é associado com uma transação pelo
escalonador no momento em que a mesma é
iniciada
Dada uma transação 𝑇, o timestamp de 𝑇 é
denotado por 𝑇𝑆(𝑇)
Timestamps devem ser únicos para cada transação e
emitidos em ordem ascendente pelo escalonador
Timestamps podem ser obtidos usando o relógio do
sistema ou simplesmente definindo um contador que é
incrementado sempre que um novo timestamp é solicitado
(notem que neste último caso, o timestamp não possui
relação com “tempo”)
105
106. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Timestamp de Objetos do BD
e Bit de Commit
Cada objeto 𝑋 do BD possui dois timestamps e
um bit de commit:
• 𝑅𝑇(𝑋): o tempo de leitura de 𝑋; consiste no
maior timestamp entre as transações que leram 𝑋
• 𝑊𝑇(𝑋): o tempo de escrita de 𝑋; consiste no
maior timestamp entre as transações que
escreveram 𝑋
• 𝐶(𝑋): bit de commit de 𝑋; este bit é 1
(verdadeiro) se e somente se a última transação
que escreveu 𝑋 já realizou o COMMIT
106
107. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Escalonamentos
Fisicamente Irrealizáveis
Temos que a ordem do timestamp de transações
define o escalonamento serial, denotado por 𝑆𝑡, ao
qual o escalonamento real das transações deverá
ser equivalente
A cada operação de leitura ou escrita, o escalonador
verifica se é possível o escalonamento atual poderá
ser equivalente à 𝑆𝑡
Caso o escalonamento atual não possa ser
equivalente a 𝑆𝑡, dizemos que este escalonamento é
fisicamente irrealizável
107
108. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Leituras Atrasadas
108
tempo
Início 𝑇 Início 𝑈
𝑈 escreve em 𝑋 𝑇 lê 𝑋
Temos que quando 𝑇 lê 𝑋, o valor de 𝑋 já foi modificado
por 𝑈, que iniciou-se após 𝑇; desta forma, 𝑇𝑆 𝑇 < 𝑊𝑇 𝑋
Entretanto, 𝑇 não deveria ler um valor escrito por 𝑈
porque, de acordo com o escalonamento 𝑆𝑡, 𝑈 é executado
depois de 𝑇
Portanto, este escalonamento é fisicamente irrealizável e
deverá ser evitado abortando T
Tempo em que a transação
ocorre teoreticamente
109. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Escritas Atrasadas
Temos que quando 𝑇 escreve 𝑋, o valor de 𝑋 já foi
modificado por 𝑈, que iniciou-se após 𝑇; desta forma,
𝑇𝑆 𝑇 < 𝑅𝑇 𝑋
Entretanto, 𝑇 não deveria escrever um novo valor se o valor
antigo foi lido por 𝑈 porque, de acordo com o
escalonamento 𝑆𝑡, 𝑈 é executado depois de 𝑇
Portanto, este escalonamento é fisicamente irrealizável e
deverá ser evitado abortantdo T
109
tempo
Início 𝑇 Início 𝑈
𝑈 lê 𝑋 𝑇 escreve 𝑋
Tempo em que a transação
ocorre teoreticamente
110. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Leituras “Sujas” (Dirty Reads)
No escalonamento acima, T lê X que foi escrito por U; como
U iniciou-se antes de T temos que TS(T)> 𝑊𝑇(𝑋) e,
portanto, o escalonamento é fisicamente realizável
Entretanto, a leitura de 𝑇 sobre 𝑋 é “suja” porque U aborta
no final
Neste contexto, é necessário usar o bit de commit 𝐶(𝑋)
para verificar se a transação que escreveu em 𝑋 por último
já realizou o COMMIT
110
tempo
Início 𝑈 Início 𝑇
𝑈 escreve 𝑋 𝑇 lê 𝑋
𝑈 aborta
111. Thomas Write Rule
No escalonamento acima, 𝑇 inicia-se antes de 𝑈 mas
escreve em 𝑋 depois de 𝑈
Desta maneira, a escrita de 𝑇 poderia ser, em princípio,
ignorada:
• Qualquer transação 𝑈𝑖, onde 𝑇𝑆 𝑈𝑖 < 𝑇𝑆(𝑈), que tentar ler 𝑋
estará na condição de leitura atrasada e será abortada
• Qualquer transação 𝑈𝑖, onde 𝑇𝑆 𝑈𝑖 > 𝑇𝑆(𝑈), que tentar ler 𝑋
deverá ler, de acordo 𝑆𝑡, o valor escrito por 𝑈 e não por 𝑇
Notem que como 𝑇 e 𝑈 escrevem diretamente sobre 𝑋 sem
realizar uma operação de leitura antes, não temos uma
atualização perdida propriamente dita 111
tempo
Início 𝑇 Início 𝑈
𝑈 escreve 𝑋 𝑇 escreve 𝑋
112. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Thomas Write Rule: Problema
Seguindo a Thomas Write Rule, a escrita de 𝑇 seria
ignorada. Entretanto se U aborta subsequentemente,
então o valor escrito deve ser mantido
Uma solução para este problema seria retardar a
escrita de 𝑇 até que a transação 𝑈 realize o COMMIT
(neste caso a escrita de 𝑇 é ignorada) ou aborte (neste
caso a escrita de 𝑇 é realizada)
112
tempo
Início 𝑇 Início 𝑈
𝑈 escreve 𝑋 𝑇 escreve 𝑋
𝑈 aborta
113. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Regras para Escalonamento
Em resposta a uma requisão de leitura e
escrita de um transação 𝑇, o escalonador
poderá:
• Acatar a requisição
• Abortar 𝑇 com um 𝑅𝑂𝐿𝐿𝐵𝐴𝐶𝐾(𝑇) e reiniciar
𝑇 com um novo timestamp
• Deixar 𝑇 em espera; mais tarde a requisição
poderá ser atendida ou 𝑇 poderá ser abortada
113
114. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Regras para Leitura
Suponha que o escalonador recebe a requisição
𝑟𝑇 𝑋
1. Se 𝑇𝑆 𝑇 ≥ 𝑊𝑇(𝑋), então a requisição é
fisicamente realizável
a. Se 𝐶(𝑋) é verdadeiro, então acate a requisição. Se
𝑇𝑆(𝑇) > 𝑅𝑇(𝑋) , então faça 𝑅𝑇(𝑋) ← 𝑇𝑆(𝑇)
b. Se 𝐶(𝑋) é falso, então deixe T em espera até que 𝐶(𝑋)
seja verdadeiro ou até que a transação que escreveu 𝑋
aborte (para evitar leitura suja)
2. Se 𝑇𝑆 𝑇 < 𝑊𝑇(𝑋), então a requisição é
fisicamente irrealizável (leitura atrasada). Aborte 𝑇 e
a reinicie com um novo timestamp
114
115. Regras Escrita
Suponha que o escalonador recebe a requisição 𝑤 𝑇 𝑋
1. Se 𝑇𝑆(𝑇) ≥ 𝑅𝑇(𝑇) e 𝑇𝑆(𝑇) ≥ 𝑊𝑇(𝑇) então a escrita é
fisicamente realizável
a. Escreva o novo valor de X
b. Faça W𝑇(𝑋) ← 𝑇𝑆(𝑇)
c. Faça 𝐶(𝑋) = falso
2. Se 𝑇𝑆(𝑇) ≥ 𝑅𝑇(𝑇) mas 𝑇𝑆(𝑇) < 𝑊𝑇(𝑇), então a
escrita é fisicamente realizável mas existe uma escrita
posterior sobre X
a. Se 𝐶(𝑋) é verdadeiro, ignore 𝑤 𝑇 𝑋 (Thomas Write Rule)
b. Se 𝐶(𝑋) é falso , então deixe T em espera até que 𝐶(𝑋) seja
verdadeiro (neste caso 𝑤 𝑇 𝑋 será ignorada) ou até que a
transação que escreveu 𝑋 aborte (neste caso 𝑤 𝑇 𝑋 será
realizada). Este procedimento evita o problema com a Thomas
Write Rule
3. Se 𝑇𝑆 𝑇 < 𝑅𝑇(𝑇), então a requisição é fisicamente
irrealizável (escrita atrasada). Aborte 𝑇 e a reinicie com
um novo timestamp
115
116. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Regras para COMMIT
Suponha que o escalonador recebe uma
requisição para COMMIT(T). Então o mesmo
terá percorrer todos objetos 𝑋 escritos por 𝑇 e
fazer 𝐶(𝑋) = 1
116
117. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Regras para ABORT
Suponha o escalonador recebe uma requisição
para abortar uma transação 𝑇 ou o próprio
escalonador decide abortar 𝑇 devido à uma
violação das condições para leitura e escrita.
Então qualquer transação que estava
aguardando por um objeto 𝑋 que 𝑇 escreveu
deverá repetir sua tentativa de leitura ou
escrita sobre 𝑋
117
119. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Agenda
Introdução e Motivação
Teoria da Serializabilidade
Isolamento Baseado em Bloqueios
Controle de Concorrência e Recuperação
Isolamento Baseado em Timestamps
Isolamento Baseado em Múltiplas Versões
Deadlocks
119
120. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Abordagem Pessimista
Protocolos baseados em bloqueios adotam uma
abordagem pessimista para lidar com conflitos
entre transações:
• transações abortam ou são colocadas em modo em
espera para resolver conflitos;
• mesmo em escalonamentos com pouca contenção de
dados, por exemplo, escalonamentos onde a maioria
das ações é de leitura, bloqueios ainda devem ser
obtidos
Em uma abordagem pessimista, é assumido que
conflitos irão ocorrer e medidas tomadas são
tomadas a priori para evitar esses conflitos
120
121. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Abordagem Otimista
Uma outra opção é adotar uma abordagem
otimista, isto é assumir que a maioria das
transações não irão conflitar e ser o mais
permissivo possível com relação à permitir que
transações executem
Conflitos são identificados após todas as ações de
uma transação terem sido realizadas, quando a
transação entre no estado de COMMIT parcial
• Conflitos são resolvidos abortando transações
121
122. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Controle de Concorrência Baseado
em Múltiplas Versões
Uma abordagem geral para controle de concorrência
consiste em manter, conceitualmente, múltiplas
versões do BD, uma versão para cada transação
Desta maneira, uma transação nunca irá ler dados
modificados por uma transação que ainda não realizou
o COMMIT, tampouco podem ocorrer problemas de
leituras não repetíveis e boa parte dos problemas com
tuplas fantasmas
A seguir, iremos apresentar uma técnica para controle
de concorrência baseada em múltiplas versões
chamada snapshot isolation que tem recebido ampla
adoção por SGBDs atuais
122
123. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Snapshot Isolation
Abordagem otimista para controle de concorrência baseada
em múltiplas versões
Seguindo a estratégia geral de abordagens otimistas, a
execução de uma transação em snapshot isolation pode ser
dividida em três etapas:
1. Leitura e Execução: a transação recebe a última versão
consistente do BD e realiza ações sobre a mesma de maneira
isolada de outras transações
2. Validação: após a transação concluir, as ações da mesma são
analizadas para identificação e correção de conflitos com
outras transações concorrentes e violações de restrições de
integridade
3. Escrita: finalmente, após passar pela etapa de Validação, a
modificações da transação são escritas no BD
A seguir, iremos detalhar cada uma dessas etapas
123
124. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Etapa de Leitura e Execução
Nesta etapa inicial, a transação recebe
(conceitualmente) uma imagem (snapshot) do BD.
Este snapshot representa a última versão consistente, isto
é, todos valores de dados foram escritos por transações
que já realizaram o COMMIT.
As ações de escritas sobre o snapshot são restritas
no espaço privado da transação e não são visíveis
para outras transações
Em outras palavras, a transação opera em completo
isolamento em relação a outras transações concorrentes
124
125. Etapa de Validação
Duas transações concorrentes sobre snapshots privados
do BD podem atualizar o mesmo objeto
• Como as transações executam isoladamente, então uma
transação não “vê” as atualizações realizadas pela outra
transação
Se ambas transações realizarem o COMMIT e escreverem
as modificações no BD, então a transação que escrever
primeiro as modificações sobrescritas pela segunda
transação
• Em outras palavras teremos uma atualização perdida
A etapa de validação é usada em snapshot isolation para
identificar e corrigir estes e outros tipos problemas
Durante esta etapa, uma transação encontra-se no estado
de COMMIT parcial
• Permissão para passar para etapa de escrita e concluir o
COMMIT só ocorre após a resolução de potenciais conflitos
125
126. Transações Concorrentes
Definição: em snapshot isolation uma
transação 𝑇1 é dita concorrente com outra
transação 𝑇2 se 𝑇2 estava ativa ou no estado
de COMMIT parcial em qualquer ponto no
intervalo de tempo após o ínicio e antes da
conclusão de sua validação de 𝑇1
126
127. Evitando Atualizações Perdidas
Existem duas estratégias para evitar
atualizações perdidas em snapshot isolation
quando uma ou mais transações concorrentes
modificam o mesmo objeto do BD:
• First committer wins: a transação que realizar o
COMMIT primeiro é validada; a demais são
abortadas
• First updater wins: a transação que realizar a
atualização primeiro é validada; as demais são
abortadas
127
128. First Committer Wins
Na estratégia first committer wins, quando uma
transação 𝑇 entra no estado de COMMIT parcial, as
seguintes ações são realizadas de maneira atômica:
• Um teste é realizado para verificar se alguma transação
que era concorrente com 𝑇 já realizou o COMMIT e
escreveu sobre algum objeto do BD que 𝑇 pretende
atualizar
• Se for encontrada alguma transação, então 𝑇 aborta e tem
que ser reiniciada
• Se nenhuma transação for encontrada, então 𝑇 tem
permissão para realizar o COMMIT e passar para a etapa
de escrita
128
129. First Updater Wins
Na estratégia first updater wins, quando uma
transação 𝑇 tentar escrever sobre um objeto
do BD, as seguintes ações são realizadas:
• Se este objeto já foi modificado por alguma outra
transação concorrente, então T aborta e tem que
ser reiniciada
• Caso contrário, 𝑇 prossegue com sua execução
129
130. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Etapa de Escrita
Após a transação passar pela etapa de
validação e ter permissão para realizar o
COMMIT, as modificações realizadas pela
mesma são escritas definitivamente no BD
Todas escritas são realizadas como uma única
ação atômica
• Desta maneira, qualquer snapshot criado para
outra transação conterá todas modificações dessa
transação ou nenhuma delas
130
131. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Problemas de Serializabilidade
Escritas e leituras sujas não são possíveis porque cada
transação apenas lê e escreve sobre uma imagem
consistente do BD
Atualizações perdidas são evitadas na etapa de
validação
Leituras não repetíveis também não são possíveis
porque modificações realizadas por transações
concorrentes não são visíveis para uma transação
Entretanto, snapshot isolation é suscetível a um tipo de
anomalia chamada write skew e certos problemas com
tuplas tuplas fantasmas
131
132. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Write Skew
Considere duas transações concorrentes, 𝑇1 e
𝑇2, e dois objetos, 𝐴 e 𝐵. Neste contexto, as
seguintes ações são realizadas:
• 𝑇1 lê o valor de 𝐴 e 𝐵 e atualiza o valor de 𝐴
• 𝑇2 lê o valor de 𝐴 e 𝐵 e atualiza o valor de 𝐵
Como as transações atualizaram objetos
diferentes, então ambas teriam permissão
para realizar o COMMIT na etapa de validação
132
133. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Write Skew (2)
Entretanto, o exemplo anterior não é serializável
Notem que existe um ciclo no grafo de precedência
de 𝑇1 e 𝑇2:
• 𝑇1 lê um valor de 𝐵 que existia antes da escrita de 𝑇2
• 𝑇2 lê um valor de 𝐴 que existia antes da escrita de 𝑇1
133
1 2
𝑇1 lê 𝐵, 𝑇2 escreve 𝐵
𝑇2 lê 𝐴, 𝑇1 escreve 𝐴
134. Write Skew: Exemplo
Considere duas contas correntes, 𝐶𝐶1 e 𝐶𝐶2, ambas com
saldo de $500, e a restrição de integridade de que a soma
do saldo das duas contas não pode ser negativo
Considere duas transações concorrentes, 𝑇1 e 𝑇2 que
pretendem debitar $700 de 𝐶𝐶1 e 𝐶𝐶2, respectivamente
As seguintes ações são realizadas:
• 𝑇1 verifica que a soma do saldo de 𝐶𝐶1 e 𝐶𝐶2 é $1000 e debita
$700 de 𝐶𝐶1 deixando-a com saldo negativo de $-200
• 𝑇2 verifica que a soma do saldo de 𝐶𝐶1 e 𝐶𝐶2 é $1000 e debita
$700 de 𝐶𝐶2 deixando-a com saldo negativo de $-200
O resultado final das ações concorrentes de 𝑇1 e 𝑇2, é que
ambas contas estarão com saldo negativo de $-200 e,
portanto, a restrição de integridade será violada
• Notem que este resultado final não poderia ocorrer em nenhum
escalonamento serial de 𝑇1 e 𝑇2
134
135. Evitando Write Skew
Uma maneira de evitar a anomalia write skew no nível de
aplicação é acrescentando a cláusula FOR UPDATE em
consultas SQL
Ex: SELECT Saldo
FROM Contas
WHERE ID = 2222
FOR UPDATE;
No expressão acima, a cláusula “FOR UPDATE” faz com que
a consulta seja intepretada pelo gerenciador de transações
como uma operação de escrita
No exemplo anterior, adicionando “FOR UPDATE” nas
consultas de 𝑇1 e 𝑇2 que lêem o saldo das contas 𝐶𝐶1 e 𝐶𝐶2
faria com que apenas uma das transações tivesse
permissão para realizar o COMMIT porque seria
considerado que as duas transações atualizaram 𝐶𝐶1 e 𝐶𝐶2
135
136. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Problemas com Tuplas Fantasmas
Como transações concorrentes executam
sobre uma image privada do BD, então
problemas com tuplas fantasmas não podem
ocorrer diretamente
• Seleções usando predicados sempre retornam o
mesmo conjunto de tuplas
Entretanto, anomalias ainda podem ocorrer
de maneira indireta, como será exemplificado
a seguir
136
137. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Problemas com Tuplas Fantasmas (2)
Considere uma restrição que define que a soma das horas
associadas com um conjunto de tarefas, que é determinada
por um predicado 𝑃, não pode ser maior que 8 horas
Neste contexto, uma transação 𝑇1 testa 𝑃, verifica que a
soma das horas é 7 e acrescenta uma nova tarefa de uma
hora
Ao mesmo tempo, outra transação 𝑇2 realiza as mesmas
ações que 𝑇1
Desta maneira, o resultado final será soma das horas igual a 9
Este cenário, que é um exemplo da anomalia de tuplas
fantasmas, não poderia ocorrer em qualquer escalonamento
serial, mas é possível em snapshot isolation
137
138. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Outros Problemas de Integridade
Execução isolada de transações concorrentes
também é suscetível a violações de restrições
básicas de integridade, como por exemplo:
• Transações concorrentes podem inserir tuplas em um
tabela com a mesma chave primária
• Uma transação pode inserir uma tupla que possui
uma chave estrangeira referenciando uma tupla 𝑡,
enquanto outra transação deleta 𝑡
Por este motivo, a etapa de validação deve
verificar se estas restrições de integridade não
estão sendo violadas antes de permitir que uma
transação realize o COMMIT
138
139. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Comparação entre Técnicas de
Controle de Concorrência
Comparando as técnicas de bloqueios, timestamps e
snapshot isolation temos:
• Bloqueios atrasam a execução de transações, mas evitam que
transações abortem (com exceção de casos de deadlocks que
serão discutidos logo mais). Timestamps e snapshot isolation
não atrasam a execução de transações, mas são mais suscetíveis
a “aborts” de transações
• Quando a interferência entre transações é baixa, timestamps e
snapshot isolation não irão causar muitos “aborts” de
transações e podem ser preferíveis a bloqueios porque os
mesmos geralmente apresentam menor overhead
• Quando é necessário abortar uma transação, timestamps
normalmente identificam problemas mais cedo do que
snapshot isolation, que permite que transações executem todas
suas ações antes de decidir se uma transação deve abortar ou
não na etapa de validação
139
140. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Agenda
Introdução e Motivação
Teoria da Serializabilidade
Isolamento Baseado em Bloqueios
Controle de Concorrência e Recuperação
Isolamento Baseado em Timestamps
Isolamento Baseado em Múltiplas Versões
Deadlocks
140
141. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Deadlocks
Um sistema encontra-se em um estado de
deadlock se existe um conjunto de transações
onde cada transação está esperando por um
objeto de dados que está bloqueado por outra
transações e nenhuma transação consegue
fazer progresso
141
142. Deadlocks: Exemplo 1
No escalonamento abaixo, 𝑇1 e 𝑇2 não podem
fazer progresso porque uma está esperando o
objeto que se encontra bloqueado pela outra
142
𝑇1 𝑇2
𝑥1 𝐴 , 𝑟1 𝐴
𝑥2 𝐵 , 𝑟2 𝐵
𝑤1 𝐴
𝑤2 𝐵
𝑥1 𝐵 Negado!
𝑥2 𝐴 Negado!
143. Deadlocks: Exemplo 2
143
No escalonamento abaixo, 𝑇1 e 𝑇2 ficam em
deadlock após ambas obterem bloqueios
compartilhados sobre A e tentarem o upgrade
subsequentemente
𝑇1 𝑇2
𝑠1 𝐴 , 𝑟1 𝐴
𝑠2 𝐴 , 𝑟2 𝐴
𝑥1 𝐴 Negado!
𝑥2 𝐴 Negado!
144. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Lidando com Deadlocks
Existem duas abordagens gerais para lidar com
deadlocks:
• Deadlocks podem ser detectados e corrigidos
(normalmente abortando uma ou mais transações
envolvidas no deadlock)
• Transações podem ser gerenciadas de maneira a evitar que
deadlocks ocorram
Iremos ver três abordagens para lidar com deadlocks
• Grafos waits-for
• Esquema wait-die
• Esquema wound-wait
144
145. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Grafos Waits-For
A situação em que transações estão aguardando por
bloqueios mantidos por outras transações pode ser
representada através do chamado grafo waits-for
Ciclos em grafos waits-for caracterizam a ocorrência de
deadlocks
Podem ser usado pelo gerenciador de transações para
identificar ou evitar deadlocks
• identificar: um grafo waits-for é construído
periodicamente; caso existam ciclos, uma ou mais
transações são abortadas
• prevenir: um grafo é mantido e ações que possam criar
ciclos no grafo não são permitidas
145
146. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Grafos Waits-For: Descrição
Cada transação que possui um bloqueio ou está
aguardando por um é representada por um
vértice
Existe uma aresta direcionada do vértice
representando a transação 𝑇 para o vértice
representando a transação 𝑈 se existe um objeto
𝐴 do BD tal que:
• 𝑈 mantém um bloqueio sobre 𝐴,
• 𝑇 está aguardando por um bloqueio sobre 𝐴,
• 𝑇 não pode obter um bloqueio sobre 𝐴 enquanto 𝑈
não libere seu bloqueio sobre 𝐴
146
147. Prof. Dr.-Ing. Leonardo Andrade Ribeiro
Grafos Waits-For: Deadlocks
Transações envolvidas em um ciclos em um
grafo waits-for não podem progredir com a
execução; portanto temos um deadlock
• A solução é abortar uma transação
Se não existem ciclos em um grafo waits-for,
então cada transação poderá completar
• Existe pelo menos uma transação que não está
esperando por nenhuma outra transação
147
148. Waits-for Grafo: Exemplo
148
𝑇1 𝑇2 𝑇3 𝑇4
𝑥1 𝐴 , 𝑟1 𝐴
𝑥2 𝐶 , 𝑟2 𝐶
𝑥3 𝐵 , 𝑟3 𝐵
𝑥4 𝐷 , 𝑟4 𝐷
𝑥2 𝐴 , Negado!
12
No escalonamento acima, a transação 𝑇2 está
aguardando para obter um bloqueio de escrita sobre 𝐴,
que está sendo mantido por 𝑇1. Portanto, existe uma
aresta do vértice 2 para o vértice 1
149. Waits-for Grafo: Exemplo
Agora, 𝑇3 aguarda por um bloqueio de escrita
sobre 𝐶, que está sendo mantido por 𝑇2
149
𝑇1 𝑇2 𝑇3 𝑇4
𝑥1 𝐴 , 𝑟1 𝐴
𝑥2 𝐶 , 𝑟2 𝐶
𝑥3 𝐵 , 𝑟3 𝐵
𝑥4 𝐷 , 𝑟4 𝐷
𝑥2 𝐴 , Negado!
𝑥3 𝐶 , Negado!
123
150. Waits-for Grafo: Exemplo
Agora, 𝑇4 também aguarda por um bloqueio de
escrita sobre 𝐴, que está sendo mantido por 𝑇1
150
𝑇1 𝑇2 𝑇3 𝑇4
𝑥1 𝐴 , 𝑟1 𝐴
𝑥2 𝐶 , 𝑟2 𝐶
𝑥3 𝐵 , 𝑟3 𝐵
𝑥4 𝐷 , 𝑟4 𝐷
𝑥2 𝐴 , Negado!
𝑥3 𝐶 , Negado!
𝑥4 𝐴 , Negado!
123 4
151. Waits-for Grafo: Exemplo
Um ciclo é formado quando 𝑇1 requisita um bloqueio
de escrita sobre 𝐵, que está sendo mantido por 𝑇3
151
𝑇1 𝑇2 𝑇3 𝑇4
𝑥1 𝐴 , 𝑟1 𝐴
𝑥2 𝐶 , 𝑟2 𝐶
𝑥3 𝐵 , 𝑟3 𝐵
𝑥4 𝐷 , 𝑟4 𝐷
𝑥2 𝐴 , Negado!
𝑥3 𝐶 , Negado!
𝑥4 𝐴 , Negado!
𝑥1 𝐵 , Negado!
123 4
153. Gerenciamento de Deadlocks
usando Timestamps
Timestamps podem ser usados para prevenir deadlocks
Quando uma transação 𝑇 requisita um bloqueio que
está sendo mantido por uma transação 𝑈, então os
timestamps de 𝑇 e 𝑈 são comparados para identificar
qual transação iniciou a execução primeiro
• 𝑇𝑆(𝑇) = tempo de ínicio da execução de 𝑇
• 𝑇𝑆 𝑇 < 𝑇𝑆 𝑈 significa que 𝑇 é mais antiga que 𝑈
Existem dois esquemas diferentes para gerenciar
transações e detectar deadlocks
• Wait-die
• Wound-wait
153
154. Esquema Wait-Die
Considere que 𝑇 requisita um bloqueio que está
sendo mantido por 𝑈
De acordo com o esquema wait-die, a seguinte
política é aplicada:
a. Se 𝑇 é mais antiga que 𝑈, então 𝑇 aguarda (waits)
até que 𝑈 libere o bloqueio
b. Se 𝑈 é mais antiga que 𝑇, então 𝑇 é abortada (dies)
154
155. Esquema Wound-Wait
Considere que 𝑇 requisita um bloqueio que
está sendo mantido por 𝑈
De acordo com o esquema wound-wait, a
seguinte política é aplicada:
a. Se 𝑇 é mais antiga que 𝑈, então 𝑇 faz com que U
seja abortada (wounds) e obtém o bloqueio
b. Se 𝑈 é mais antiga que 𝑇, então 𝑇 aguarda
(waits) até que 𝑈 libere o bloqueio
155
156. Timestamps de Transações
Notem que este timestamp é usado apenas para
gerenciamento de deadlocks: não confundir com
o timestamp usado para controle de concorrência
visto anteriormente
• Em particular, quando uma transação é abortada
devido ao controle de concorrência, a transação é
reiniciada com um novo timestamp, com valor maior
que o timestamp original
• Quando uma transação é abortada devido ao
gerenciamento de deadlocks, a transação é reiniciada
com o mesmo timestamp
156
158. Wait-Die: Exemplo
Usando o esquema wait-die, os principais eventos no
escalonamento anterior são:
Passo 1: 𝑇1 obtém um bloqueio sobre 𝐴
Passo 2: 𝑇2 tenta obter um bloqueio sobre 𝐴 e é abortada porque
𝑇1 já possui um bloqueio incompátivel sobre 𝐴 e 𝑇𝑆 𝑇1 < 𝑇𝑆 𝑇2
Passos 4: 𝑇4 também tenta obter um bloqueio sobre 𝐴 e é abortada
porque 𝑇1 já possui um bloqueio incompátivel sobre 𝐴 e 𝑇𝑆 𝑇1 <
𝑇𝑆 𝑇4
Passo 6: Após obter com sucesso os bloqueios sobre 𝐵 (Passo 3) e 𝐶
(Passo 5), 𝑇3 completa
Passo 8: 𝑇1 completa e 𝑇4 reinicia (com o mesmo timestamp)
Passos 9: 𝑇4 obtém bloqueio sobre 𝐴; 𝑇2 reinicia
Passo 10: 𝑇2 tenta obter um bloqueio sobre 𝐴 e é colocada em
espera porque𝑇4 já possui um bloqueio incompátivel sobre 𝐴 e
𝑇𝑆 𝑇2 < 𝑇𝑆 𝑇4
Passos 12 e 15: 𝑇4 e 𝑇2 completam nos passos 12 e 15,
respectivamente
158
160. Wound-Wait: Exemplo
Usando o esquema wound-die, os principais eventos no
escalonamento anterior são:
Passo 1: 𝑇1 obtém um bloqueio sobre 𝐴
Passo 2: 𝑇2 tenta obter um bloqueio sobre 𝐴 e é colocada em
espera porque 𝑇1 já possui um bloqueio incompátivel sobre 𝐴 e
𝑇𝑆 𝑇1 < 𝑇𝑆 𝑇2
Passos 4: 𝑇4 também tenta obter um bloqueio sobre 𝐴 e é
colocada em espera porque 𝑇1 já possui um bloqueio incompátivel
sobre 𝐴 e 𝑇𝑆 𝑇1 < 𝑇𝑆 𝑇4
Passo 5: 𝑇1 obtém um bloqueio sobre 𝐵 e, com isso, 𝑇3 que havia
obtido um bloqueio sobre 𝐵 no Passo 3, é abortada porque
𝑇𝑆 𝑇1 < 𝑇𝑆 𝑇3
Passo 6 e 7: 𝑇1 completa no Passo 6, liberando o bloqueio sobre
𝐴, que é obtido por 𝑇2 no Passo 7
Passos 9 e 10: 𝑇2 completa no Passo 9, liberando o bloqueio sobre
𝐴, que é obtido por 𝑇3 no Passo 10
Passos 12 e 15: 𝑇4 completa e 𝑇3 reinicia no passos 12;
𝑇3 completa no Passo 15 160
161. Wait-Die vs. Wound-Wait
Em wound-wait, uma transação mais nova é abortada sempre
que uma transação mais velha requisita um bloqueio mantido
pela transação mais nova
Normalmente, uma transação tende a obter bloqueios
no estágio inicial de sua execução
Baseando-se na assunção acima, será raro em wound-wait a
situação em que uma transação antiga é abortada devido a uma
requisição de bloqueio de outra transação ainda mais velha
Portanto, aborts de transações são raros em wound-wait
No caso de wait-die, aborts serão mais frequentes
porque quando uma transação requisita um bloqueio
mantido por outra transação, é mais provável que a
transação que mantém o bloqueio seja mais velha
161
162. Wait-Die vs. Wound-Wait (2)
Quando um abort ocorre em wait-die, a
transação abortada provavelmente estará no
estágio inicial e uma quantidade relativamente
menor de ações terão que ser desfeitas
Por outro lado, quando um abort ocorre em
wound-wait, a transação provalmente já terá
realizado uma quantidade maior de ações que
terão que ser desfeitas
Portanto, aborts são mais raros em wound-wait
do que em wait-die, mas quando estes ocorrem,
o overhead com o processo de undo será maior
em wound-wait
162
163. Timestamps vs. Grafo Waits-For
Usando timestamps, transações abortadas sempre
reiniciam com o timestamp original
Portanto, tanto em wait-die quanto em wound-wait, uma
transação que for abortada irá se tornar mais velha em
relação às demais transações ativas quando reiniciar
Portanto, usando timestamps, existe a garantia que todas
transações irão completar
• Em outras palavras, timestamps não é suscetível ao problema
conhecido como starvation
Usando waits-for para detectar deadlocks, caso nenhuma
outra medida seja adotada, uma transação pode
indefinidamente ser abortada e reiniciada em uma nova
situação de deadlock
163
164. Timestamps vs. Grafo Waits-For (2)
Wait-die e wound-wait são mais simples de
implementar do que a construção periódica
grafos waits-for
Por outro lado, usando grafos waits-for, uma
transação só é abortada quando a mesma
realmente está envolvida em um deadlock;
usando timestamps, transações podem ser
abortadas mesmo sem estar em situação de
deadlock e sem a possibilidade de entrar em
deadlock ao longo de sua execução
164
165. Referências Adicionais
Jim Gray, Raymond A. Lorie, Gianfranco R.
Putzolu, Irving L. Traiger: Granularity of Locks
and Degrees of Consistency in a Shared Data
Base. IFIP Working Conference on Modelling
in Data Base Management Systems 1976: 365-
394
165