Documentos de Académico
Documentos de Profesional
Documentos de Cultura
DBDD - Clase 1 - Transacciones
DBDD - Clase 1 - Transacciones
DISEÑO DE
BASE DE DATOS
TRANSACCION
Colección de operaciones
que forman una única
unidad lógica de trabajo.
Propiedad de una
transacción
Atomicidad
Consistencias
Aislamiento -- Concurrencia
Durabilidad
ATOMICIDAD
Atomicity,
Consistency,
Isolation
Durability
ACCESO A LA BASE DE DATOS
Mediante 2 operaciones
Leer (x)
Transfiere de BD a memoria intermedia de la
T(x)
Escribir (x)
Transfiere de memoria intermedia a la base
de datos
EJEMPLO
Sea Ti una transacción para transferir Q. 50.00
de la cuenta A hacia la cuenta B. Se puede
definir dicha transacción como
Ti:leer(A);
A := A – 50;
escribir(A);
leer(B);
B := B + 50;
escribir(B).
analizando
Consistencia
Que no sea alterado el balance de las
cuentas A y B al efectuar el traslado de
fondos (transacción)
Responsabilidad:
Programador
analizando
Atomicidad
Suponiendo que la cuenta A tiene Q.1,000 y la
B tiene Q.2,000 antes de efectuar el traslado
Que pasaría si durante el proceso de ejecutar
la transacción ocurriera un fallo en el sistema?
Alimentación
Hardware
Software
Otro
analizando
Durabilidad
Una vez se completa con éxito una T(x)
aunque ocurriera un fallo en el sistema no
se puede corromper dicha T(x)
Que pasaría si durante el proceso de
ejecutar la transacción ocurriera un fallo en
el sistema?
analizando
Aislamiento
Que pasaría si todas las 3 propiedades se
cumplieran sin problema sin embargo 2
cuenta habientes hacen un retiro al mismo
tiempo?
La solución es ejecutarlas secuencialmente
las transacciones
Modelos de almacenamiento
Volátil
Falta de energía eléctrica se pierde la
información
No Volátil
Falta de energía NO se pierde la información
Discos duros, CDs, etc.
Permanente
No importa lo que pase siempre se dispondrá
de la información
Múltiples copias
Modelos de almacenamiento
Almacenamiento Secundario
No volátil
Almacenamiento Primario
Es volátil
RAM
procesamiento
Procesamiento Concurrente
Es aquel que se da cuando varios procesos
corren al mismo tiempo
Procesamiento Paralelo
Sistema operativo maneja recursos de un
sistema y guarda la información en bloques
(sectores)
Bloque y buffer
Bloque
Es la unidad de almacenamiento
secundario
Buffer
Es la unidad de transferencia de
información entre el almacenamiento
primario y secundario
Es la unidad de almacenamiento primario
Bloque y buffer
Por lo regular si el DBMS pide un registro
trae todo el bloque
El cual puede contener varios registros.
MODELO DE TRANSACCION
Una transacción que termina su
ejecución con éxito se dice que está
comprometida
Una transacción comprometida que
haya hecho modificaciones transforma la
base de datos llevándola a un nueva
estado consistente, que permanece
incluso si hay fallo en el sistema
En ausencia de fallos, todas las
transacciones se completan con éxito
MODELO DE TRANSACCION
Una transacción que no termina su
ejecución con éxito se dice que está
abortada
Para asegurar la atomicidad, las
transacciones abortadas no deben tener
efecto sobre el estado de la base de datos,
cualquier cambio que haya hecho la
transacción abortada debe deshacerse
Una vez deshechos los cambios de una
transacción abortada se dice que la
transacción se ha retrocedido
MODELO DE TRANSACCION
Una transacción debe estar en uno de los siguientes estados:
Activa (estado inicial): la transacción permanece en este
estado durante su ejecución
Parcialmente Comprometida: la transacción pasa a este
estado cuando acaba de realizar la última instrucción
Fallida: la transacción pasa a este estado tras descubrir que
no puede continuar la ejecución normal
Abortada: la transacción pasa a este estado después de
haber restablecido la base de datos a su estado anterior
Comprometida: la transacción pasa a este estado tras
completarse con éxito
MODELO DE TRANSACCION
Commit
parcialmente comprometida
comprometida
activa
Fallo
Rollback
fallida abortada
Implementación de
transacciones sql
En la norma SQL el comienzo de una transacción
se especifica explícitamente (usualmente
begin/start transaction)
Las transacciones terminan con una de las
siguientes instrucciones:
commit work (compromete la transacción actual)
rollback work (provoca que la transacción
aborte)
Almacenamiento
secundario
bitacor
a
Almacenamiento
primario
Bitacora (log) Transaction T2
Cuenta A = 10,000 •Begin transaction
Cuenta B = 5,000 Transaction T1 •ReadDB(B)
Cuenta C = 1,000 •Begin transaction •ReadDB(C)
Cuenta D = 10,000 •ReadDB(A) •B= B – 1000
Cuenta E = 10,000 •A = A + 5000 •C = C + 1000
Cuenta F = 3,000 •WriteDB(A) •WriteDB(B)
Cuenta G = 8,000 •Commit •WriteDB(C)
•Commit
Transaction T3
•Begin transaction Transaction T4 Transaction T5
•ReadDB(D) •Begin transaction •Begin transaction
•ReadDB(G) •ReadDB(A) •ReadDB(B)
•D= D – 1000 •A= A – 10,000 •B= B + 10,000
•G= G + 1000 •WriteDB(A) •WriteDB(B)
•WriteDB(D) •Commit •Commit
•WriteDB(G)
•Commit
Problemas de concurrencia
Laejecución concurrente de
transacciones puede dar lugar a
problemas:
Problema de la actualización perdida
Problema de leer una actualización
temporal (lectura sucia)
Problema del resumen incorrecto
Problema de la lectura no repetible
Técnicas de bloqueo (lock)
A cada elemento de datos o gránulo X de la
BD se le asocia una variable
operación lock_exclusivo(X): deja bloqueado al
que lo pide si otro ya tiene cualquier lock sobre
X
operación lock_compartido(X): deja
bloqueado al que lo pide si otro ya tiene un
lock exclusivo sobre X
operación unlock(X): libera su lock sobre X
Antes de leer X lock_compartido(X)
Antes de escribir (leer) X lock_exclusivo(X)
Si no se va a leer o escribir más unlock(X)
Deadlocks
Deadlock (o abrazo mortal o interbloqueo):
Cuando una transacción T1 está bloqueada esperando a
que otra T2 libere un lock, la cual también está bloqueada
esperando a que T1 libere uno de sus lock. Se puede
generalizar para N transacciones.
Prevención de deadlocks
Cada transacción obtiene todos los locks al principio y si no
puede entonces no obtiene ninguno. Problema de livelock
(inanición de algunas transacciones que pueden no obtener
todos los que necesiten)
Los elementos de la BD están ordenados de alguna manera y
los lock hay que obtenerlos en dicho orden. Los programadores
deben controlarlo !!
Detección y recuperación de deadlocks.
A medida que se piden y conceden los lock se construye un
grafo de las transacciones que están esperando a otras. Si
existe un ciclo en dicho grafo: deadlock. Hay que proceder a
abortar a alguna de las transacciones. Problema de livelock si
se aborta siempre a la misma!
En la practica (Oracle pl/sql)
DECLARE
importe NUMBER;
ctaOrigen VARCHAR2(23);
ctaDestino VARCHAR2(23);
BEGIN
importe := 100;
ctaOrigen := '2530 10 2000 1234567890';
ctaDestino := '2532 10 2010 0987654321';
UPDATE CUENTAS SET SALDO = SALDO - importe
WHERE CUENTA = ctaOrigen;
UPDATE CUENTAS SET SALDO = SALDO + importe
WHERE CUENTA = ctaDestino;
INSERT INTO MOVIMIENTOS
(CUENTA_ORIGEN, CUENTA_DESTINO,IMPORTE, FECHA_MOVIMIENTO)
VALUES
(ctaOrigen, ctaDestino, importe*(-1), SYSDATE);
INSERT INTO MOVIMIENTOS
(CUENTA_ORIGEN, CUENTA_DESTINO,IMPORTE, FECHA_MOVIMIENTO)
VALUES
(ctaDestino,ctaOrigen, importe, SYSDATE);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Error en la transaccion:'||SQLERRM);
dbms_output.put_line('Se deshacen las modificaciones);
ROLLBACK;
END;
EN LA PRACTICA (ORACLE
PL/SQL)
create or replace procedure prueba (nfilas number)
as
begin
savepoint ninguna;
insert into tmp values ('primera fila');
savepoint una;
insert into tmp values ('segunda fila');
savepoint dos;
if nfilas=1 then
rollback to una;
else if nfilas=2 then
rollback to dos;
else
rollback to ninguna;
end if;
commit;
exception
when other then
rollback
end prueba;