Suponha duas
transações T1 e T2:
BEGIN
TRANSACTION T1
UPDATE
Banco
SET Saldo = ((SELECT Saldo FROM Banco WHERE Conta = 10) – 100)
WHERE Conta = 10
UPDATE Banco
SET Saldo = ((SELECT Saldo FROM Banco WHERE Conta = 20) + 100)
WHERE
Conta = 20
COMMIT
TRANSACTION T1
BEGIN
TRANSACTION T2
UPDATE
Banco
SET Saldo = ((SELECT Saldo FROM Banco WHERE Conta = 20) – 200)
WHERE Conta = 20
UPDATE Banco
SET Saldo = ((SELECT Saldo FROM Banco WHERE Conta = 30) + 200)
WHERE
Conta = 30
COMMIT
TRANSACTION T2
1) As instruções de leitura e escrita dos dados
da transação T1, obtidas a partir da SQL, são as
seguintes:
READ Conta 10
WRITE Conta 10
READ Conta 20
WRITE Conta 20
Seguindo o exemplo
acima, obtenha as instruções de leitura e escrita dos dados da transação T2.
2) Determine as
possíveis escalas de execução concorrente serializáveis
em conflito e/ou em visão.
3) Proponha escalas de execução concorrente serializáveis usando os protocolos:
a) bloqueio em duas fases, com granularidade
de bloqueio por tupla.
b) timestamps
4) Verifique se
existe a possibilidade de deadlock ao executar T1 e T2 de modo concorrente.
5) Suponha uma nova transação T3 concorrente
com T1 e T2 e mostre que
existe a possibilidade de deadlock ao usar o bloqueio em duas fases:
BEGIN
TRANSACTION T3
UPDATE
Banco
SET Saldo = ((SELECT Saldo FROM Banco WHERE Conta = 30) – 200)
WHERE Conta = 30
UPDATE Banco
SET Saldo = ((SELECT Saldo FROM Banco WHERE Conta = 10) + 200)
WHERE
Conta = 10
COMMIT
TRANSACTION T3
6) Recupere o deadlock verificados na questão anterior abortando a
transação com o menor tempo de execução. Mostre uma possível escala de execução
a partir da recuperação do deadlock.
7) Proponha uma escala de execução concorrente serializável para T1, T2 e T3 usando multi-versão.
8) Com que granularidade de bloqueio é possível executar
concorrentemente T1, T2 e a
transação T4?
BEGIN
TRANSACTION T4
SELECT
AVG(Saldo) FROM Banco
COMMIT TRANSACTION T4
9) Verifique se a
escala abaixo:
|
T5 |
T6 |
T7 |
|
Read(A) |
|
|
|
|
Read(A) |
|
|
Write(B) |
|
|
|
|
Write(A) |
|
|
|
|
Read(B) |
|
|
|
Write(A) |
a)
É serializável em conflito
b)
É
recuperável
c)
Evita rollback em
cascata