Transacciones y ACID en Bases de Datos
Transacciones y ACID en Bases de Datos
Estamos solos
Hasta ahora
Estamos solos
No estamos solos
Transactions
Transactions
Componente que asegura las propiedades ACID
Atomicity
Consistency
Isolation
Durability
Transactions
UPDATE cuentas
SET saldo = saldo - v
WHERE cid = 1
UPDATE cuentas
SET saldo = saldo + v
WHERE cid = 2
Transacciones
Atomicity
Consistency
Isolation
Durability
Atomicity:
Sin Consistency:
Sin Isolation:
Atomicity
Transaction Consistency Log y
Manager Isolation Recovery Manager
Durability
Transacciones
Necesitamos transacciones
UPDATE cuentas
SET saldo = saldo - v
WHERE cid = 1
UPDATE cuentas
SET saldo = saldo + v
WHERE cid = 2
COMMIT
Transacciones en SQL
T1 T2 A B
READ(A,x) 1000 1000
WRITE(A, x - 100) 900
READ(A, y)
T1 T2 A
READ(A,x) 1
IF(x > 0)
READ(A, y)
IF(y > 0)
WRITE(A, y - 1) 0
ENDIF
WRITE(A, x - 1) -1
ENDIF -1
Conflictos con Transacciones
Escritura de datos temporales
T1 T2 A B
WRITE(A,10) 10
WRITE(B,10) 10
WRITE(A,20) 20
WRITE(B,20) 20 20
Conflictos con Transacciones
Escritura de datos temporales
T1 T2 A B
WRITE(A,10) 10
WRITE(A,20) 20
WRITE(B,20) 20
WRITE(B,10) 20 10
Schedule
T1 T2
READ(A,x) READ(A,y)
WRITE(A,x) WRITE(A,y)
READ(B,x) READ(B,y)
WRITE(B,x) WRITE(B,y)
Schedule
Un schedule
T1 T2
READ(A,x)
x:= x + 100
WRITE(A,x)
READ(B,x)
x:= x + 200
WRITE(B,x)
READ(A,y)
y:= y * 2
WRITE(A,y)
READ(B,y)
y:= y * 3
WRITE(B,y)
Schedule
Otro schedule
T1 T2
READ(A,x)
x:= x + 100
WRITE(A,x)
READ(A,y)
y:= y * 2
WRITE(A,y)
READ(B,x)
x:= x + 200
WRITE(B,x)
READ(B,y)
y:= y * 3
WRITE(B,y)
Schedule Serial
T1 T2
READ(A,x)
x:= x + 100
WRITE(A,x)
READ(B,x)
x:= x + 200
WRITE(B,x)
READ(A,y)
y:= y * 2
WRITE(A,y)
READ(B,y)
y:= y * 3
WRITE(B,y)
Schedule Serializable
T1 T2
READ(A,x)
x:= x + 100
WRITE(A,x)
READ(A,y)
y:= y + 100
WRITE(A,y)
Posibles problemas
Lo qué el sistema quiere
T1 T2
READ(A,x)
READ(A,y)
x:= x + 100
y:= y + 100
WRITE(A,x)
WRITE(A,y)
Transacciones
Notación
• Ri(X), Rj(Y)
• Ri(X), Wj(Y) con X != Y
• Wi(X), Rj(Y) con X != Y
• Wi(X), Wj(Y) con X != Y
T1 T2
READ(A)
READ(A)
READ(C)
READ(B)
WRITE(A)
WRITE(C)
READ(D)
Permutaciones permitidas
T1 T2
READ(A)
READ(A)
READ(C)
READ(B)
WRITE(A)
WRITE(C)
READ(D)
Permutaciones permitidas
T1 T2
READ(A)
READ(A)
READ(C)
READ(B)
WRITE(A)
WRITE(C)
READ(D)
Permutaciones permitidas
T1 T2
READ(A)
READ(A)
READ(C)
READ(B)
WRITE(A)
WRITE(C)
READ(D)
Permutaciones permitidas
T1 T2
READ(A)
READ(A)
READ(C)
READ(B)
WRITE(A)
WRITE(C)
READ(D)
Permutaciones permitidas
T1 T2
READ(A)
READ(A)
READ(C)
READ(B)
WRITE(A)
WRITE(C)
READ(D)
Permutaciones permitidas
T1 T2
READ(A)
READ(A)
READ(C)
WRITE(A)
READ(B)
WRITE(C)
READ(D)
Permutaciones permitidas
T1 T2
READ(A)
READ(A)
READ(C)
WRITE(A)
READ(B)
WRITE(C)
READ(D)
Permutaciones permitidas
T1 T2
READ(A)
READ(A)
READ(C)
WRITE(A)
READ(B)
READ(D)
WRITE(C)
Permutaciones permitidas
T1 T2
READ(A)
READ(A)
READ(C)
READ(B)
WRITE(A)
WRITE(C)
READ(D)
Acciones Conflictivas
T1 T2
READ(A)
WRITE(A)
WRITE(C)
WRITE(C)
WRITE(A)
READ(A)
READ(D)
Permutaciones no permitidas
T1 T2
WRITE(A)
READ(A)
WRITE(C)
WRITE(C)
WRITE(A)
READ(A)
READ(D)
Permutaciones no permitidas
T1 T2
WRITE(A)
READ(A)
WRITE(C)
WRITE(C)
WRITE(A)
READ(A)
READ(D)
Permutaciones no permitidas
Cuidado!!!
T1 T2
WRITE(A)
READ(A)
WRITE(C)
WRITE(C)
WRITE(A)
READ(A)
READ(D)
Permutaciones no permitidas
Cuidado!!!
T1 T2
WRITE(A)
READ(A)
WRITE(C)
WRITE(C)
WRITE(A)
READ(A)
READ(D)
Permutaciones no permitidas
Cuidado!!!
T1 T2
WRITE(A)
READ(A)
WRITE(C)
WRITE(C)
WRITE(A)
READ(A)
READ(D)
Acciones Conflictivas
¿Es serializable?
T1 T2 T3
R2(A)
R1(B)
W2(A)
R3(A)
W1(B)
W3(A)
R2(B)
W2(B)
Permutando a serial
Ejemplo
Permutemos!
T1 T2 T3
R2(A)
R1(B)
W2(A)
R3(A)
W1(B)
W3(A)
R2(B)
W2(B)
Permutando a serial
Ejemplo
Permutemos!
T1 T2 T3
R1(B)
R2(A)
W2(A)
R3(A)
W1(B)
W3(A)
R2(B)
W2(B)
Permutando a serial
Ejemplo
Permutemos!
T1 T2 T3
R1(B)
R2(A)
W2(A)
W1(B)
R3(A)
W3(A)
R2(B)
W2(B)
Permutando a serial
Ejemplo
Permutemos!
T1 T2 T3
R1(B)
R2(A)
W2(A)
W1(B)
R3(A)
W3(A)
R2(B)
W2(B)
Permutando a serial
Ejemplo
Permutemos!
T1 T2 T3
R1(B)
R2(A)
W1(B)
W2(A)
R3(A)
W3(A)
R2(B)
W2(B)
Permutando a serial
Ejemplo
Permutemos!
T1 T2 T3
R1(B)
R2(A)
W1(B)
W2(A)
R3(A)
W3(A)
R2(B)
W2(B)
Permutando a serial
Ejemplo
Permutemos …
T1 T2 T3
R1(B)
W1(B)
R2(A)
W2(A)
R3(A)
W3(A)
R2(B)
W2(B)
Permutando a serial
Ejemplo
R3(A)
W1(B)
W3(A)
W2(B)
Grafo de precedencia
W1(B)
W3(A)
T3
W2(B)
Grafo de precedencia
Ejemplo (Pizarra)
W1(B)
W3(A)
T3
W2(B)
Grafo de precedencia
Ejemplo (Pizarra)
W1(B)
W3(A)
T3
W2(B)
Grafo de precedencia
Ejemplo (Pizarra)
W1(B)
W3(A)
T3
W2(B)
Grafo de precedencia
W1(B)
W3(A)
T3
W2(B)
Strict 2PL
Deadlock:
T2 espera qué termina T1
T1 espera qué termina T2
SQL y transacciones
Lo básico
START TRANSACTION;
SELECT anombre
FROM Actores;
COMMIT;
SQL y transacciones
Lo básico
START TRANSACTION;
SELECT anombre
FROM Actores;
COMMIT;
SQL y transacciones
Cancelar una transacción
START TRANSACTION;
UPDATE Actores
SET bio = 'El major actor'
WHERE nombre = 'Adrian Soto';
ROLLBACK;
START TRANSACTION;
UPDATE Actores
SET bio = 'El major actor'
WHERE nombre = 'Adrian Soto';
SAVEPOINT MejorActores;
UPDATE Actores
SET bio = 'El peor actor'
WHERE nombre = 'Juan Reutter';
ROLLBACK TO SAVEPOINT MejorActores;
SQL y transacciones
Savepoints
Al ejecutar, se borra el SAVEPOINT
START TRANSACTION;
Útil en un programa qué hace varias
UPDATE Actores transacciones y verifica condiciones
1 34 9
FROM Sailors AS S
2 21 8
WHERE [Link] = 8; 3 16 8
4 26 10
SQL y transacciones
Granularidad de locks
1 34 9
FROM Sailors AS S
2 21 8
WHERE [Link] = 8; 3 16 8
4 26 10
1 34 9
FROM Sailors AS S
2 21 8
WHERE [Link] = 8; 3 16 8
4 26 10
3 16 8
WHERE [Link] = 8;
4 26 10
shared lock
T2 sid age rating
1 34 9
INSERT INTO Sailors AS S
2 21 8
VALUES (5,22,8); 3 16 8
4 26 10
"fantasma" 5 22 8
SQL y transacciones
Granularidad y "fantasmas"
3 16 8
WHERE [Link] = 8;
4 26 10
T2
INSERT INTO Sailors AS S
VALUES (5,22,8); espera a T1
SQL y transacciones
Nivel de aislamiento
SERIALIZABLE No No No
Fallas en la ejecución:
• Datos erróneos
• Solución: restricciones de integridad, data
cleaning
Fallas en la ejecución:
• Catástrofes
• Solución: copias distribuidas
• <START T>
• <COMMIT T>
• <ABORT T>
• <T UPDATE>
• <START T>
• <COMMIT T>
• <ABORT T>
• <T, X, t> donde t es el valor antiguo de X
Undo Logging
En resumen:
Log
<START T1>
<T1, a, 5>
<START T2>
<T2, b, 10>
<START CKPT (T1, T2)>
<T2, c, 15>
<START T3>
<T1, d, 20>
<COMMIT T1>
<T3, e, 25>
<COMMIT T2>
<END CKPT>
Ejemplo
Uso de Checkpoints en Undo Logging
Log
<START T1>
<T1, a, 5>
<START T2>
<T2, b, 10>
<START CKPT (T1, T2)>
<T2, c, 15>
<START T3>
<T1, d, 20>
<COMMIT T1>
<T3, e, 25>
Undo Logging
• <START T>
• <COMMIT T>
• <ABORT T>
• <T, X, v> donde v es el valor nuevo de X
Redo Logging
En resumen:
Log
<START T1>
<T1, a, 5>
<START T2>
<COMMIT T1>
<T2, b, 10>
<START CKPT (T2)>
<T2, c, 15>
<START T3>
<T3, e, 25>
<END CKPT>
<COMMIT T2>
<COMMIT T3>
Redo Logging
Undo Redo