You are on page 1of 18

Ing.

Alfredo Monterrubio Bastida

Transacciones en MySQl
Orientado a la arquitectura 4 capas.

Contenido Introducción En este documento se presenta información recabada de distintas fuentes para ayudar al lector a comprender y utilizar las transacciones y el control ce concurrencia en el gestor de base de datos de MySQL. En un principio con los conceptos básicos redactados en palabras comunes para facilitar la comprensión y finalmente el código con los comandos para configurar MySQL para las transacciones y control de concurrencia. .

software o incluso de ataques de terceras personas.¿Qué es una transacción? Una transacción en base de datos es una operación de un conjunto. En general se puede hacer rollback para cualquier conjunto de instrucciones no necesariamente dentro de una transacción Transferencia de fondos1: . esto para evitar conflictos y salvaguardar la información si en el proceso existe un problema como puede ser de hardware. en donde este conjunto es atomico. osea que se realiza un todo o nada. Una transacción se comienza con una instrucción on begin transaction (no es necesario en algunos DBMS). cualquier cambio que la transacción pudo hacer a la BD se deshace. La instrucción on commit termina la transacción en forma exitosa y hace permanente cualquier cambio realizado a la BD durante la transacción Los cambios se hacen permanentes solo después de un commit La instrucción rollback aborta la transacción y la hace terminar en forma no exitosa.

DÍAZ. la ejecución concurrente de dos consultas SQL puede ser incorrecta si no se toman las precauciones adecuadas. Si A1 no tiene suficiente dinero⇒rollback 3.1. Por ejemplo. Se aumenta el saldo de A2 en el monto especificado. (s. Recuperado el 08 de agosto de 2013. de http://campuscurico. por privilegios de acceso. M.f. M.utalca.Consultas unitarias. o para evitar bloqueos Consistencia La ejecución aislada de la transacción conserva la consistencia de la base de datos. 5.cl. debido a una división por cero. P. Campus curico. Se disminuye el saldo de A1 en el monto especificado.pdf Propiedades de las transacciones Atomicidad Es la propiedad de las transacciones donde se observan como un todo y se ejecutan de la misma manera o todo o nada Casos a considerar: . Aislamiento Para cada par de transacciones que puedan ejecutarse concurrentemente Ti y Tj. J.Operación abortada. se cumple que . En P.f. 4.).begin transaction 2. . P. (s.utalca. Arquitectura 4 capas . Rojas.cl/~jperez/bd/documentos/transacciones.). commit 1 DÍAZ. Incluso para consultas unitarias hay que preservar la atomicidad: en un Sistema operativo de tiempo compartido.

Niveles de aislamiento: • • • • • • • Lectura no comprometida. (Retrocesos) Lectura no repetible. Mayor nivel de aislamiento. mayor precisión.Tj ha comenzado después de que termine Ti Las transacciones son independientes entre sí Niveles de aislamiento Se puede ajustar el nivel de aislamiento entre las transacciones y determinar para una transacción el grado de aceptación de datos inconsistentes. Comportamiento concurrente de las transacciones. Lectura repetible. Lectura fantasma. Sólo se permiten lecturas de datos comprometidos. Lectura sucia.Tj ha terminado antes de que comience Ti . Una lectura de una fila que no existía cuando se inició la transacción. Lectura comprometida. Menor nivel. A mayor grado de aislamiento. . Durabilidad El sistema gestor de bases de datos asegura que perduren los cambios realizados por una transacción que termina con éxito Estados de una transacción Activa: Cuando se ejecuta la transacción Parcialmente comprometida: aun sin completar. Asegura que no se lean datos corruptos físicamente. Lectura de datos no comprometidos. pero a costa de menor concurrencia. El nivel de aislamiento para una sesión SQL establece el comportamiento de los bloqueos para las instrucciones SQL. Las lecturas repetidas de la misma fila para la misma transacción dan los mismos resultados.para los efectos de Ti: . Se obtienen resultados inconsistentes en lecturas repetidas. Secuenciable. Las transacciones se aíslan completamente.

roysched WHERE titles.title_id=roysched.royalty=16) UPDATE roysched SET royalty=17 WHERE royalty=16 ELSE ROLLBACK TRAN actualiza_comisiones IF EXISTS (SELECT titles.royalty FROM titles. se debe dejar sin modificar.title_id AND roysched. roysched WHERE titles.Inicio de la transacción USE pubs IF EXISTS (SELECT titles.Fallida: no se realizó la transaccion Abortada: se abortó la transacción por alguna razón y la base de datos regresa a su estado anterior Ejecución. En este ejemplo se deben incrementar ambos.royalty=15) BEGIN . Se puede reiniciar o cancelar Ejemplo de código para transacciones en SQL Server2 (Rojas): Incremento de un 1% de las comisiones 15% y 16% de la tabla de comisiones roysched . BEGIN TRAN actualiza_comisiones -.royalty FROM titles.title_id=roysched.title.title_id AND roysched. Si no existen estos porcentajes entonces no se ejecutará la instrucción de actualización.title. si uno de ellos no existe. roysched. roysched.

UPDATE roysched SET royalty=16 WHERE royalty=15 COMMIT TRAN actualiza_comisiones END ELSE ROLLBACK TRAN actualiza_comisiones 2 DÍAZ. la segunda debe esperar a que la primera lo suelte para obtener el acceso. Si dos ejecuciones tratan de obtener un lock para actualizar una tabla. M. J. .utalca. P. DÍAZ.pdf Control de concurrencia Forma en que el DBMS maneja las ejecuciones paralelas en la BD Principalmente dos enfoques: • Optimista: supone que los conflictos son escaso ⇒permitir acceso concurrente y deshacer las acciones problemáticas.cl. Recuperado el 08 de agosto de 2013. M. la primera que trate de obtenerlo tendrá acceso exclusivo a la tabla.). Además de los locks exclusivos existen locks de solo lectura o locks compartidos que pueden estar simultáneamente siendo utilizados por distintas ejecuciones. Tupla. de http://campuscurico. Pesimista: asume que es muy probable que ocurran problemas ⇒ actúa a la defensiva impidiendo la aparición de conflictos usando locks • Un lock es una estructura que solo puede ser adquirida por una hebra de ejecución (thread) a la vez. Arquitectura 4 capas . Los locks pueden tener distintas granularidades: Base de Datos.). Campus curico. (s.f. (s. En P.cl/~jperez/bd/documentos/transacciones. Rojas.f.utalca. P. Tabla. Atributo.

Transacciones en MySQL (comandos) Un ejemplo Supongamos que un sitio web bancario tiene 2 usuarios. todos los cambios producidos por consultas anteriores pueden ser revertidos.usuario 1 bal2 := . Esto implica que usar transacciones es un poco más lento que no usarlas. Recomiendo leer la información de Wikipedia para entender de qué se trata esto. SELECT balance FROM cuentas WHERE cuenta=X -. se termina la transacción con COMMIT. ambos trabajando sobre la misma cuenta. los datos (en el caso de InnoDB las filas y en el caso de MyISAM las tablas) afectados quedan bloqueados.. ya que el usuario 2 actualiza el registro con información vieja.. por lo que el resultado final es como si la consulta del usuario 1 no se hubiera ejecutado nunca. SELECT balance FROM cuentas WHERE cuenta=X -. Al final. Si éstas resultan exitosas. Luego se ejecutan las consultas que deban ejecutarse. Cualquier consulta que tenga que ver con los mismos datos será demorada hasta que la transacción termine. El usuario 1 pide incrementar su saldo en 10. Supongamos que ambas necesitan actualizar el valor en la base de datos: UPDATE cuentas SET balance=(bal1+10) WHERE cuenta=X -. ya que si en mitad del proceso una consulta falla. para saber si una consulta falló basta con ver el valor de retorno de mysql_query y para ver el número de filas afectadas sigue valiendo usar mysql_num_rows Mientras la transacción está ejecutándose. . así que bien podría suceder lo siguiente: bal1 := .usuario 1 UPDATE cuentas SET balance=(bal2-10) WHERE cuenta=X -. un acrónimo inglés que quiere decir Atomicidad. Aislamiento y Durabilidad. es decir.. en vez de quedar con el mismo saldo. Lo que se necesita para este conjunto de consultas. existen dos copias de la aplicación que contienen una variable $balance cada una. lo cual provoca que los cambios hechos por las consultas anteriores sean permanentes. Consistencia. se puede volver al estado anterior al comienzo de la transacción ejecutando ROLLBACK Aunque los datos no sean realmente escritos a la o las tablas involucradas hasta ejecutar el COMMIT. nadie puede acceder a ellos. la cuenta termina perdiendo 10. permiten asegurar la consistencia de los datos. Y por esto. y por lo tanto se evita la situación planteada al principio como ejemplo. Si las consultas fallan en algún paso.usuario 2 El resultado es que ambas copias del programa ejecutaron sus consultas con la información de balance que tenían. por ejemplo) El programador del sistema no puede decidir el orden en el que se ejecutarán las consultas. es lo que se denomina ACID. las consultas devuelven lo mismo que si lo fueran. pero a la vez implica que los datos involucrados no pueden ser modificados por otra copia de la aplicación. se ejecuta una que solamente contiene BEGIN. ¿Cómo usar transacciones? Usar transacciones es muy simple: antes de ejecutar la primer consulta.. mientras que el usuario 2 pide disminuirlo (a través de un formulario.usuario 2 En este punto. pero lo importante es lo siguiente: las transacciones son un conjunto de consultas que se ejecutan como si fuesen una.

autocommit MySQL tiene una variable de entorno llamada autocommit.Ejemplo de una transacción desde un lenguaje de programación (PHP) usando condiciones para que según sea la situación se ejecute la transacción o se aborte y la base de datos no sufra ningún cambio. Para cambiar el valor de autocommit.. hay que poner autocommit a 0 (desactivarlo). cabe mencionar que la sintaxis puede cambiar. el siguiente fragmento de información está orientado a MySQL y si se compara con el código anterior de SQL Server se observa que la sintaxis cambia muy poco.. Configurado de esta manera no se pueden usar transacciones. 9 else 10 mysql_query("ROLLBACK"). implementada de forma “transaccional” en PHP. Para usar transacciones entonces. porque MySQL automáticamente hace un COMMIT luego de cada consulta. Ejemplo de transacción en la consola de Servidor MySQL versión 5. 5 6 if ($resultado !== false) 7 // la consulta fue exitosa 8 mysql_query("COMMIT"). quedaría: 1 <?php 2 mysql_query("BEGIN").. Nota: si autocommit se pone a cualquier número N > 1. Dicha situación. que por defecto tiene el valor 1. MySQL hace un COMMIT automático luego de N consultas.5 . simplemente se usa SET autocommit = 0. 4 $resultado = mysql_query("UPDATE cuentas SET balance=$balance+10 WHERE cuenta=X"). 3 $balance = . mysql_query("SELECT balance FROM cuentas WHERE cuenta=X").. MySQL Comandos para la transacción en cualquier gestor de base de datos.

.

es cuando podemos pensar en usar Transacciones. los datos corrompidos y eso es un grave problema! Entonces. se ejecuta ROLLBACK y con esto NADA se modifica. se ejecuta COMMIT y los cambios se realizan Arquitectura 4 capas para el procesamiento de consultas3 . si en alguna sentencia ocurre un error. todo vuelve a su estado original. //Cuándo ejecutemos COMMIT es cuándo hasta ese momento todas las sentencias que le preceden tendrán efecto! antes no. y en cambio.COMMIT. si todo salió bien. Esto es especialmente útil en muchos casos cuando debemos ejecutar varias sentencias SQL pero sabemos que si alguna de ellas falla por X razón entonces todo estará mal.

M. M. • • • Simplificación. P. . 3 DÍAZ. Localización de Datos La entrada a esta capa es una consulta algebraica definida sobre relaciones distribuidas.). Optimización Global de Consultas Dada una consulta algebraica sobre fragmentos. Involucra la manipulación de los cuantificadores de la consulta y de los calificadores de la misma mediante la aplicación de la prioridad de los operadores lógicos. Mediante reglas de transformación una consulta en el cálculo relacional se transforma a una en el álgebra relacional. Se detecta y rechazan consultas semánticamente incorrectas. DÍAZ. Análisis. Consiste de cuatro partes: • Normalización. Cada subconsulta que se ejecuta en un nodo. El objetivo de esta capa es localizar los datos de la consulta usando la información sobre la distribución de datos. La optimización local utiliza los algoritmos de sistemas centralizados. el objetivo de esta capa es hallar una estrategia de ejecución para la consulta cercana a la óptima.f. es optimizada usando el esquema local del nodo. Optimización Local de Consultas El trabajo de la última capa se efectúa en todos los nodos con fragmentos involucrados en la consulta. Reestructuración. En P. llamada consulta local. (s. Arquitectura 4 capas .La primera capa descompone una consulta. Elimina predicados redundantes.

. listar y seleccionar la base de datos. Entrar a la consola de MySQL.Uso de transacciones para realizar consultas y crear reportes del proyecto de Casa de Materiales Lomas.

Configurar la tabla requerida para la consulta como InnoDB .

Iniciar transacción. . abortar la transacción al notar un error. insertar un registro y consultar la información.

.

.

.. Concepts. H.Transacción ejecutada Bibliografía SILBERSCHATZ. STEFANO. PARABOSCHI.. TORLONE. A. 3ª edición. SUDARSHAN. 1998... “Database Systems. S... KORTH. C. R. McGraw-Hill. Languages and Architectures”. S. McGraw-Hill. ATZENI. "Fundamentos de bases de datos". 2000.F. P.