Bases de Dados (CC2005), Dep. Ciência de Computadores, FCUP
Eduardo R. B. Marques, DCC/FCUP
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 $
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 |
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. |