You are on page 1of 9

PROGRAMA ACADMICO DE TECNOLOGAS DE LA INFORMACIN Actividad {Comandos para transacciones en MySQL} Como requerimiento parcial para Acreditar la asignatura

de {Base de datos para aplicaciones} Que presentan: Alumno T.S.U. Luis F. Nava Aguilar T.S.U. Hilse M. Osorio Miranda T.S.U. Javier Ramrez Garca No. Control TI12909 TI102910 TI102911

Asesor Gonzalo Rosas Cabrera Izcar de Matamoros, Pu., 15 de September de 2013

RESUMEN
Hay una serie de propiedades que las transacciones deben poseer adems de las cuatro propiedades bsicas, denominadas propiedades ACID que son atomicidad, coherencia aislamiento y permanencia. Las transacciones representan la unidad de recuperacin bsica en un sistema de base de datos. Es responsabilidad del gestor de recuperacin garantizar dos de las cuatro propiedades ACID de las transacciones, la atomicidad y la permanencia, en presencia de fallos. El gestor de recuperacin tiene que garantizar que al recuperarse de un fallo, todos los efectos de una transaccin dada sean almacenados permanentes en la base de datos o que no se almacene ninguno de ellos. Las transacciones tambin ayudan a que no se modifiquen datos por dos usuarios al mismo tiempo. Con las tablas MyISAM se puede hacer esto con el comando LOCK TABLE, pero esto bloqueara toda la tabla, en cambio con InnoDB solo se bloquea el registro que se est afectando.

1 DESARROLLO
Por default MySQL se encuentra en modo auto commit, esto quiere decir que si no se especifica un BEGIN, MySQL automticamente lo hace y al finalizar la transaccin, automticamente hace un COMMIT. Cuando nosotros escribimos BEGIN (tambin es posible hacerlo con START TRANSACTION que es el standard de ANSI), MySQL deshabilita el auto commit y cuando le damos un COMMIT o ROLLBACK se habilita nuevamente el auto commit. Tambin es posible deshabilitar el auto commit mediante el comando SET AUTOCOMMIT = 0. En este caso todos los quieres que se ejecuten, llevaran un BEGIN explicito y tendrn que escribir el COMMIT o ROLLBACK para finalizar la transaccin. En las tablas InnoDB no es permitido abrir una transaccin dentro de otra, si se hiciera esto MySQL automticamente le dar un COMMIT a la transaccin abierta. Los pasos para usar transacciones en MySQL son: Iniciar una transaccin con el uso de la sentencia BEGIN. Actualizar, insertar o eliminar registros en la base de datos. Si se quieren los cambios a la base de datos, completar la transaccin con el uso de la sentencia COMMIT. nicamente cuando se procesa un COMMIT los cambios hechos por las consultas sern permanentes. Si sucede algn problema, podemos hacer uso de la sentencia ROLLBACK para cancelar los cambios que han sido realizados por las consultas que han sido ejecutadas hasta el momento.

Una transaccin tiene dos finales posibles, COMMIT y ROLLBACK. Por defecto, MySQL trae activado el modo autocommit, es decir, realizada una transaccin (por ejemplo un INSERT, UPDATE o DELETE) el autocommit es confirmado apenas es ejecutado. Para desactivar el autocommit, ejecute el comando: SET AUTOCOMMIT=0; Una vez deshabilitado el autocommit, tendremos que utilizar obligatoriamente el COMMIT para confirmar o ROLLBACK para deshacer la transaccin. Si se quiere deshabilitar el autocommit para una serie de comandos, lo ideal es utilizar START TRANSACTION (sin necesidad de desactivar el AUTOCOMMIT).

Veremos un ejemplo completo donde utilizaremos START TRANSACTION (no es necesario AUTOCOMMIT en 0). CREATE TABLE `departamentos` ( `CODIGO` INTEGER(11) NOT NULL DEFAULT 0, `NOMBRE` VARCHAR(100), `PRESUPUESTO` INTEGER(11) DEFAULT NULL, PRIMARY KEY (`CODIGO`) )ENGINE=InnoDB Ahora, insertaremos registros de la tabla departamentos_externos a departamentos mediante una transaccin: START TRANSACTION; SELECT @A := presupuesto FROM departamentos_externos WHERE codigo =11; INSERT INTO departamentos( codigo, nombre, presupuesto ) VALUES ( 11, Department test, @A ); COMMIT; En el ejemplo anterior, se guardo el presupuesto del departamento externo 11 en la variable @A y luego fue asignado al presupuesto en la tabla departamentos.

En MySQL 5.0, InnoDB soporta los comandos SQL SAVEPOINT y ROLLBACK TO SAVEPOINT. El comando SAVEPOINT crea un punto dentro de una transaccin con un nombre identifier. Si la transaccin actual tiene un punto con el mismo nombre, el antiguo se borra y se crea el nuevo. El comando ROLLBACK TO SAVEPOINT deshace una transaccin hasta el punto nombrado. Las modificaciones que la transaccin actual hace al registro tras el punto se deshacen en el rollback, pero InnoDB no libera los bloqueos de registro que se almacenaron en memoria tras el punto. (Tenga en cuenta que para un nuevo registro insertado, la informacin de bloqueo se realiza a partir del ID de transaccin almacenado en el registro; el bloqueo no se almacena separadamente en memoria. En este caso, el bloqueo de registro se libera al deshacerse todo.) Los puntos creados tras el punto nombrado se borran.

Si un comando retorna el siguiente error, significa que no existe ningn punto con el nombre especificado: ERROR 1181: Got error 153 during ROLLBACK Todos los puntos de la transaccin actual se borran si ejecuta un COMMIT, o un ROLLBACK que no nombre ningn punto.

Sintaxis de SET TRANSACTION


SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE } Este comando prepara el nivel de aislamiento de transaccin para la siguiente transaccin, globalmente, o para la sesin actual. El comportamiento por defecto de SET TRANSACTION es poner el nivel de aislamiento para la siguiente transaccin (que no ha empezado todava). Si usa la palabra clave GLOBAL el comando pone el nivel de aislamiento de transaccin por defecto globalmente para todas las transacciones creadas desde ese momento. Las conexiones existentes no se ven afectadas. Necesita el permiso SUPER para hacerlo. Usar la palabra clave SESSION determina el nivel de transaccin para todas las transacciones futuras realizadas en la conexin actual. El siguiente ejemplo muestra dos transacciones. La primera se confirma, la segunda se cancela. shell> mysql test Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5 to server version: 3.23.50-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> CREATE TABLE CUSTOMER (A INT, B CHAR (20), INDEX (A)) -> ENGINE=InnoDB; Query OK, 0 rows affected (0.00 sec) mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO CUSTOMER VALUES (10, 'Heikki'); Query OK, 1 row affected (0.00 sec) mysql> COMMIT; Query OK, 0 rows affected (0.00 sec) mysql> SET AUTOCOMMIT=0; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO CUSTOMER VALUES (15, 'John'); Query OK, 1 row affected (0.00 sec) mysql> ROLLBACK;

Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM CUSTOMER; +------+--------+ |A |B | +------+--------+ | 10 | Heikki | +------+--------+ 1 row in set (0.00 sec) mysql> SAVEPOINTS Los savepoints, son marcas que se hacen dentro de una transaccin para poder regresar a un punto en especifico. Esto se hace mediante el comando ROLLBACK TO SAVEPOINT, con esto se hace commit a las operaciones que estn hasta el SAVEPOINT y lo posterior se hace ROLLBACK. TERMINO DE TRANSACCIONES DE MANERA AUTOMTICAMENTE . Las transacciones son terminadas automticamente, como si se le diara COMMIT por los siguientes comandos: ALTER TABLE, CREATE INDEX, CREATE TABLE,DROP DATABASE,

DROP TABLE, LOCK TABLES, RENAME TABLE, SET AUTOCOMMIT=1, TRUNCATE, UNLOCK TABLES READ UNCOMMITTED. sentencias SELECT son ejecutadas de una manera sin bloqueo, pero una versin anterior de una fila puede ser utilizado. Por lo tanto, con este nivel de aislamiento, las lecturas no son consistentes. Esto tambin se llama una "lectura sucia." De lo contrario, este nivel de aislamiento funciona como READ COMMITTED. LEA COMPROMETIDOS. Un nivel de aislamiento tanto de Oracle como con respecto a la constante (sin bloqueo) dice: Cada lectura consistente, incluso dentro de la misma transaccin, Establece y lee su propia captura mas reciente. Para bloquear lee (SELECT FOR UPDATE o LOCK IN SHARE MODE), InnoDB bloquea slo registros de ndice, no los vacos antes que ellos, y por lo tanto permite la libre insercin de nuevos registros junto a los registros bloqueados. Para las instrucciones UPDATE y DELETE, cerradura depende de si la instruccin utiliza un ndice nico con una condicin de bsqueda nica (como WHERE id = 100), o una condicin de bsqueda amplia de tipo (como WHERE id> 100). Para obtener un ndice nico con una condicin de bsqueda nica,

InnoDB bloquea slo el registro de ndice hallado, no la brecha delante de l. Para realizar bsquedas de tipo gama, InnoDB bloquea el rango de ndices analizados, el uso de bloqueos de espacios o de prxima clave (brecha de ms registro de ndice) cerraduras para bloquear inserciones de otras sesiones en las lagunas cubiertas por la gama. Esto es necesario porque "filas fantasma" deben ser bloqueadas para la replicacin de MySQL y de recuperacin para el trabajo. REPEATABLE READ. Este es el nivel de aislamiento predeterminado de InnoDB. Para las lecturas consistentes, hay una diferencia importante desde el nivel de aislamiento READ COMMITTED: Todas las lecturas consistentes dentro de la misma transaccin leen la instantnea creado por la primer lectura. Este convenio significa que si se emiten varias simple (sin bloqueo) instrucciones SELECT en la misma transaccin, estas sentencias SELECT son compatibles tambin con respecto a la otra. Para bloquear lee (SELECT FOR UPDATE o LOCK IN SHARE MODE), UPDATE y DELETE, cerradura depende de si la instruccin utiliza un ndice nico con una condicin de bsqueda nica, o una condicin de bsqueda amplia de tipo. Para obtener un ndice nico con una condicin de bsqueda nica, InnoDB bloquea slo el registro de ndice hallado, no la brecha delante de l. Para las condiciones de bsqueda, InnoDB bloquea el rango de ndices analizados, el uso de bloqueos de espacios o de prxima clave (brecha de ms registro de ndice) cerraduras para bloquear inserciones de otras sesiones en las lagunas Cubiertas por la gama. SERIALIZABLE Este nivel es como REPEATABLE READ, pero InnoDB convierte implcitamente todas las instrucciones SELECT simple con SELECT... LOCK IN SHARE MODE si autocommit est desactivado. En caso de confirmacin automtica est habilitada, el SELECT es su propia transaccin. Por lo tanto, se sabe que es de slo lectura y se puede serializar si se realiza como una constante (sin bloqueo) y no necesita leer el bloque para otras transacciones. (Esto significa que a fuerza de un SELECT simple para bloquear si otras transacciones han modificado las filas seleccionadas, debe desactivar la ejecucin automtica.)

2 CONCLUSIONES Y RECOMENDACIONES
En la realizacin de este trabajo encontramos cosas muy interesantes, este trabajo nos deja un aprendizaje sobre las transacciones de bases de datos, encontramos muchas cosas que facilitan el manejo de los datos en los gestores de bases de datos, ya que se pueden insertar, actualizar y eliminar datos no solo en un motor de base de datos si no que se pueden hacer estas operaciones con bases de datos distribuidas que se encuentran en diferentes servidores. Es de suma importancia conocer como se realizan las transacciones, ya que de hacerlo podra causar serios problemas en los datos, es importante conocer como se inicia un bloque de instrucciones o como se deshace, como ya se menciono anterior mente es recomendable deshabilitar el auto commit.

3 REFERENCIAS
(s.f.). LuAuF. (27 de Mayo de 2009). Recuperado el 21 de Febrero de 2011, de LuAuF: http://luauf.com/2008/10/13/commit-de-transacciones-en-mysql/ MySQL. (20 de Junio de 1997). Recuperado el 21 de Febrero de 2011, de MySQL: http://dev.mysql.com/doc/refman/5.0/es/savepoints.html MySQL. (30 de Enero de 1997). Recuperado el 21 de Febrero de 2011, de MySQL: http://dev.mysql.com/doc/refman/5.0/es/innodb-transactions-with-different-apis.html

Thomas M. Connolly y Carolyn E. Begg(2005). Sistema de base de datos. Madrid: Pearson Educacion S.A.

You might also like