Aulas práticas - Ficha 6 - Soluções

Bases de Dados (CC2005), Dep. Ciência de Computadores, FCUP

Eduardo R. B. Marques, DCC/FCUP

2

CREATE PROCEDURE transfer_sol(IN id1 INT, IN id2 INT, IN amount INT, OUT done BOOLEAN)
BEGIN
  DECLARE v1 INT;
  DECLARE v2 INT;

  START TRANSACTION;

  SET v1 = NULL;
  SET v2 = NULL;
  
  SELECT Value INTO v1 
  FROM ACCOUNT 
  WHERE AccountId = id1;
  
  SELECT Value INTO v2 
  FROM ACCOUNT 
  WHERE AccountId = id2;
 
  IF v1 IS NULL OR V2 IS NULL OR v1 < amount OR id1 = id2 THEN
    ROLLBACK;
    SET done = FALSE;
  ELSE
    UPDATE ACCOUNT 
    SET Value = Value - amount 
    WHERE AccountId = id1;
    
    UPDATE ACCOUNT 
    SET Value = Value + amount 
    WHERE AccountId = id2;
    
    COMMIT;
    SET done = TRUE;
  END IF;
END $

3

Vars Ordem T1 → T2 Ordem T2 → T1
(1) a = 1
b = 2
c = 3
d = 4
V(1) = 100 - 100 = 0
V(2) = 200 + 100 = 300
V(3) = 300 - 200 = 100
V(4) = 400 + 200 = 600
igual
(2) a = 666
b = c = 3
d = 4
T1 falha.

V(666) = N/D
V(3) = 300 - 200 = 100
V(4) = 400 + 200 = 600


igual
(3) a = 2
b = c = 1
d = 4
V(2) = 200 - 100 = 100
V(1) = 100 + 100 - 200 = 0
V(4) = 400 + 200 = 600
T2 falha: saldo de conta 1 é de apenas 100 < 200 se T2 executar 1º

V(2) = 200 - 100 = 100
V(1) = 100 + 100 + 0 = 200
V(4) = 400 + 0 = 400
(4) a = 2
b = c = 3
d = 4
V(2) = 200 - 100 = 100
V(3) = 300 + 100 - 200 = 200
V(4) = 400 + 200 = 600
igual
(5) a = c = 2
b = 1
d = 4
T2 falha: saldo de 2 fica a 100 depois de T1

V(2) = 200 - 100 - 0 = 100
V(1) = 100 + 100 = 200
V(4) = 400 + 0 = 400
T1 falha: saldo de 2 fica a 0 depois de T2.

V(2) = 200 - 0 - 200 = 0
V(1) = 100 + 0 = 100
V(4) = 400 + 200 = 600

4

T1; T2; T3; T4

T1 T2 T3 T4
[2] 200 → 100
[1] 100 → 200
[1] 200 → 0
[3] 300 → 500
[3] 500 → 100
[4] 400 → 800
[4] 800 → 300
[5] 500 → 1000

T1; T2; T4; T3

T1 T2 T4 T3
[2] 200 → 100
[1] 100 → 200
[1] 200 → 0
[3] 300 → 500
Sem efeito. [3] 500 → 100
[4] 400 → 800

T2; T1; T3; T4

T2 T1 T3 T4
Sem efeito. [2] 200 → 100
[1] 100 → 200
Sem efeito. Sem efeito.

T2; T1; T4; T3

T2 T1 T4 T3
Sem efeito. [2] 200 → 100
[1] 100 → 200
Sem efeito. Sem efeito.