Transacciones Base de Datos

35
TRANSACCIONES DISEÑO DE BASE DE DATOS

description

Introduccion a las transacciones dentro de las BD

Transcript of Transacciones Base de Datos

TRANSACCIONES

TRANSACCIONES

DISEO DE BASE DE DATOS

TRANSACCIONColeccin de operaciones que forman una nica unidad lgica de trabajo.2Propiedad de una transaccinAtomicidadConsistenciasAislamiento -- ConcurrenciaDurabilidad

3ATOMICIDADTodas las operaciones de la transaccin se realizan adecuadamente en la base de datos o ninguna de ellas4consistenciaLa ejecucin aislada de la transaccin (sin otra que se ejecute concurrentemente) conserva la consistencia de la base de datos)5aislamientoAunque se ejecuten varias transacciones concurrentemente, el sistema garantiza que para cada par de transacciones, no se entrelazaran en su ejecucin, sino que se realizaran de forma independiente.

6DURABILIDADTras la finalizacin con xito de una transaccin, los cambios realizados en la base de datos permanecen, incluso si hay fallos en el sistema.

7Propiedades ACID

Atomicity, Consistency, Isolation Durability8ACCESO A LA BASE DE DATOSMediante 2 operacionesLeer (x)Transfiere de BD a memoria intermedia de la T(x)Escribir (x)Transfiere de memoria intermedia a la base de datos9EJEMPLOSea Ti una transaccin para transferir Q. 50.00 de la cuenta A hacia la cuenta B. Se puede definir dicha transaccin comoTi: leer(A);A := A 50;escribir(A);leer(B);B := B + 50;escribir(B).10analizandoConsistenciaQue no sea alterado el balance de las cuentas A y B al efectuar el traslado de fondos (transaccin)Responsabilidad:Programador

11analizandoAtomicidadSuponiendo que la cuenta A tiene Q.1,000 y la B tiene Q.2,000 antes de efectuar el trasladoQue pasara si durante el proceso de ejecutar la transaccin ocurriera un fallo en el sistema?AlimentacinHardwareSoftwareOtro

12analizandoDurabilidadUna vez se completa con xito una T(x) aunque ocurriera un fallo en el sistema no se puede corromper dicha T(x)Que pasara si durante el proceso de ejecutar la transaccin ocurriera un fallo en el sistema?

13analizandoAislamientoQue pasara si todas las 3 propiedades se cumplieran sin problema sin embargo 2 cuenta habientes hacen un retiro al mismo tiempo?La solucin es ejecutarlas secuencialmente las transacciones

14Modelos de almacenamientoVoltilFalta de energa elctrica se pierde la informacinNo VoltilFalta de energa NO se pierde la informacinDiscos duros, CDs, etc.PermanenteNo importa lo que pase siempre se dispondr de la informacinMltiples copias15Modelos de almacenamientoAlmacenamiento SecundarioNo voltilAlmacenamiento PrimarioEs voltilRAM

16procesamientoProcesamiento ConcurrenteEs aquel que se da cuando varios procesos corren al mismo tiempoProcesamiento ParaleloSistema operativo maneja recursos de un sistema y guarda la informacin en bloques (sectores)

17Bloque y bufferBloqueEs la unidad de almacenamiento secundario

BufferEs la unidad de transferencia de informacin entre el almacenamiento primario y secundario Es la unidad de almacenamiento primario

18Bloque y bufferPor lo regular si el DBMS pide un registro trae todo el bloqueEl cual puede contener varios registros.

19MODELO DE TRANSACCIONUna transaccin que termina su ejecucin con xito se dice que est comprometidaUna transaccin comprometida que haya hecho modificaciones transforma la base de datos llevndola a un nueva estado consistente, que permanece incluso si hay fallo en el sistemaEn ausencia de fallos, todas las transacciones se completan con xitoMODELO DE TRANSACCIONUna transaccin que no termina su ejecucin con xito se dice que est abortadaPara asegurar la atomicidad, las transacciones abortadas no deben tener efecto sobre el estado de la base de datos, cualquier cambio que haya hecho la transaccin abortada debe deshacerseUna vez deshechos los cambios de una transaccin abortada se dice que la transaccin se ha retrocedidoMODELO DE TRANSACCIONSiguientes estados:MODELO DE TRANSACCIONparcialmente comprometidafallidacomprometidaabortadaactivaConsistentePuede estar inconsistenteConsistenteFalloFinCommitRollbackFalloImplementacin de transacciones sqlEn la norma SQL el comienzo de una transaccin se especifica explcitamente (usualmente begin/start transaction)Las transacciones terminan con una de las siguientes instrucciones:commit work (compromete la transaccin actual)rollback work (provoca que la transaccin aborte)

Si el programa termina sin ninguna de estas rdenes, los cambios se comprometen o abortan segn indique cada sistemaImplementacin de transacciones sqlPrograma pagar_chequeWrite (ingrese cuenta)Read (cta)Write (valor)Read (valor)Begin transactionReadDB (cta, saldo)Saldo = saldo valorWriteDB (cta, saldo)Write DB (cheque, P)CommitWrite (Pague)Implementacin de transacciones sqlBegin transactionReadDB (cta, saldo)If saldo >= valor thenBeginSaldo = saldo valorWriteDB (cta, saldo)CommitWrite (Pague)End BeginWriteDB (histo, x)CommitEnd

Modelo de falloABCDETiempo de verificacinTiempo de falloRECUPERACION DEL SISTEMAPara que el sistema se pueda recuperar ante fallos se necesita grabar cada operacin con la BD en un fichero LOG (bitcora). Checkpoints.Se escribe en el fichero LOG antes que en la BDEl fichero LOG debe estar en memoria establePor cada operacin se escribe un reg. en LOG

Bitacora (log)Archivo especial que no conviene tenerlo en el mismo disco o directorio donde esta la base de datos.bitcoraAlmacenamiento primarioAlmacenamiento secundarioBitacora (log)Transaction T1Begin transactionReadDB(A)A = A + 5000WriteDB(A)Commit

Transaction T2Begin transactionReadDB(B)ReadDB(C)B= B 1000C = C + 1000WriteDB(B)WriteDB(C)Commit

Transaction T3Begin transactionReadDB(D)ReadDB(G)D= D 1000G= G + 1000WriteDB(D)WriteDB(G)Commit

Transaction T4Begin transactionReadDB(A)A= A 10,000WriteDB(A)Commit

Transaction T5Begin transactionReadDB(B)B= B + 10,000WriteDB(B)Commit

Cuenta A = 10,000Cuenta B = 5,000Cuenta C = 1,000Cuenta D = 10,000Cuenta E = 10,000Cuenta F = 3,000Cuenta G = 8,000

30Problemas de concurrenciaLa ejecucin concurrente de transacciones puede dar lugar a problemas:Problema de la actualizacin perdidaProblema de leer una actualizacin temporal (lectura sucia)Problema del resumen incorrectoProblema de la lectura no repetibleTcnicas de bloqueo (lock)A cada elemento de datos o grnulo X de la BD se le asocia una variableoperacin lock_exclusivo(X): deja bloqueado al que lo pide si otro ya tiene cualquier lock sobre Xoperacin lock_compartido(X): deja bloqueado al que lo pide si otro ya tiene un lock exclusivo sobre Xoperacin unlock(X): libera su lock sobre XAntes de leer X lock_compartido(X)Antes de escribir (leer) X lock_exclusivo(X)Si no se va a leer o escribir ms unlock(X)DeadlocksDeadlock (o abrazo mortal o interbloqueo): Cuando una transaccin T1 est bloqueada esperando a que otra T2 libere un lock, la cual tambin est bloqueada esperando a que T1 libere uno de sus lock. Se puede generalizar para N transacciones.Prevencin de deadlocksCada transaccin obtiene todos los locks al principio y si no puede entonces no obtiene ninguno. Problema de livelock (inanicin de algunas transacciones que pueden no obtener todos los que necesiten)Los elementos de la BD estn ordenados de alguna manera y los lock hay que obtenerlos en dicho orden. Los programadores deben controlarlo !!Deteccin y recuperacin de deadlocks.A medida que se piden y conceden los lock se construye un grafo de las transacciones que estn 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)asbeginsavepoint ninguna;insert into tmp values ('primera fila');savepoint una;insert into tmp values ('segunda fila');savepoint dos;if nfilas=1 thenrollback to una;else if nfilas=2 thenrollback to dos;elserollback to ninguna;end if;commit;exceptionwhen other thenrollbackend prueba;