You are on page 1of 3

Unidad IV.

- CONTROL DE TRANSACCIONES
Una transaccin es una unidad de trabajo compuesta por varias instrucciones SQL que cumple con las propiedades ACID. Diagrama de transicin de estados para la ejecucin de transacciones:
Leer/Escribir Verificar Inicio (T) Activa Fin (T) Parcialmente confirmada Confirmad a

Error (T) Error (T)

Fallida

Terminada

Bitcora del sistema

IV.1.

Propiedades de la transaccin. (ACID)

Atomicidad (Atomicity). Una transaccin tiene que ser atmica lo que significa que es indivisible; todas las operaciones deben ejecutarse o ninguna en lo absoluto. No debe haber posibilidad de que solo una parte se ejecute. La atomicidad se garantiza a travs de mecanismos de base de datos con los que se hace el seguimiento de la transaccin. Si la transaccin falla por cualquier razn, las actualizaciones que se hayan realizado hasta el momento sern deshechas. Solo si la transaccin llega al fin los cambios se volvern parte de la base de datos. Consistencia (Consistency). Una transaccin mantendr la consistencia de la base de datos. Esto es, si la base de datos se encuentra en un estado consistente antes de ejecutar la transaccin, una vez que sta termine la consistencia de la base de datos deber conservarse. Aislamiento (Isolation). Se dice que un conjunto de transacciones est aislado si el efecto del sistema que las ejecuta es el mismo que si ejecutara cada una a la vez; las transacciones se ejecutan en secuencia. La base de datos tpicamente usa tcnicas de locking o versioning en los datos que cada transaccin accede. El efecto de esto es hacer que la ejecucin parezca en serie aunque, internamente, el sistema ejecuta las transacciones en paralelo. Durabilidad (Durability). Cuando una transaccin termina de ejecutarse, todas sus actualizaciones se graban en algn tipo de medio de almacenamiento, tpicamente disco, en donde se asegura que las actualizaciones no se perdern. Aun si el sistema operativo falla, los resultados de la transaccin son almacenados en disco y podrn ser encontrados ah cuando se recupere el sistema operativo. Ms an, la durabilidad a menudo debe mantenerse por un periodo largo. Ejemplo de una transaccin en MySQL: START TRANSACTION; conjunto de instrucciones SQL COMMIT;

IV.2.

Grados de consistencia.

En trminos de base de datos esto significa que se satisfacen todas las restricciones en cuanto a su integridad que incluyen: 1er Dominio: Los valores almacenados en un campo cumplen las restricciones del tipo de campo y las propiedades del campo.

2do Tupla o PK: No deben existir dos registros (filas) idnticos en una tabla. Todos los valores de la llave primaria son nicos 3er relacin FK: La base de datos mantiene integridad referencial lo que significa que los registros solo referencia informacin que existe 4to BD o predicado: Ciertos predicados se mantienen. Por ejemplo, la suma de los gastos es menor o igual al presupuesto. A diferencia de la atomicidad, el aislamiento y la durabilidad, la consistencia es una prctica de programacin. Es responsabilidad del desarrollador de la aplicacin asegurar que su programa preserva la consistencia.

IV.3.

Niveles de aislamiento.

El estndar ANSI/ISO SQL define cuatro niveles de aislamiento transaccional en funcin de tres hechos que deben ser tenidos en cuenta entre transacciones concurrentes. Estos hechos no deseados son: Lecturas "sucias" Una transaccin lee datos escritos por una transaccin no esperada, no cursada. Lecturas no repetibles Una transaccin vuelve a leer datos que previamente haba ledo y encuentra que han sido modificados por una transaccin cursada. Lectura "fantasma" Una transaccin vuelve a ejecutar una consulta, devolviendo un conjunto de filas que satisfacen una condicin de bsqueda y encuentra que otras filas que satisfacen la condicin han sido insertadas por otra transaccin cursada. Los cuatro niveles de aislamiento y sus correspondientes acciones se describen ms abajo. SET TRANSACTION ISOLATION LEVEL Lectura no cursada (READ UNCOMMITTED) Lectura cursada (READ COMMITTED) Lectura repetible (REPEATABLE READ) Serializable (SERIALIZABLE) Lectura "sucia" Lectura repetible Posible No posible No posible No posible Posible Posible No posible No posible no Lectura "fantasma" Posible Posible Posible No posible

IV.4.

Instrucciones COMMIT y ROLLBACK

La terminacin exitosa de una transaccin se conoce como CONFIRMADA mientras que a la falla de una transaccin se le conoce como ABORTADA. Para usar las transacciones . IMPORTANTE: MySQL maneja por defecto un autoconfirmacin en cada operacin Si se desea usar ROLLBACK y COMMIT debe desactivarse con SET AUTOCOMMIT=0; Instruccin SET TRANSACTION ISOLATION LEVEL nivel_aislamiento COMMIT ROLLBACK SAVEPOINT identificador ROLLBACK TO SAVEPOINT identificador Descripcin Establece el nivel de aislamiento de una transaccin. Asienta la transaccin de forma permanente Deshace los cambios efectuados por la transaccin Indica un punto de referencia intermedio en una transaccin Deshace las operaciones hasta el punto de referencia indicado, es til cuando las transacciones son extensas y no se desea reiniciarla totalmente en caso de fallo.

Ejemplo: /*Transferencia de $500 de la cuenta 001 a la 002*/ SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; start transaction; update CUENTA set monto=monto-500 where no_cuenta=001; update CUENTA set monto=monto+500 where no_cuenta=002; commit; /*Transferencia de $500 de la cuenta 001 a la 002 con puntos de referencia*/ SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; start transaction; savepoint retiro; update CUENTA set monto=monto-500 where no_cuenta=001; savepoint deposito1; update CUENTA set monto=monto+500 where no_cuenta=123; rollback to savepoint deposito1; commit; /*Obtener el total de cubculos y guardarlo en estadsticas con manejo de variables*/ SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; start transaction; select @conteo:=count(*) from cubiculo; insert into estadisticas values(1, 'Cantidad de cubiculos', @conteo); commit; /*Pasar al historial todos los movimientos del ao 2008*/ SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; start transaction; insert historial_movimiento select * from movimiento where anyo=2008; delete from movimiento where anyo=2008; commit;

You might also like