SlideShare una empresa de Scribd logo
Transacciones en MYSQL
El servidor de bases de datos MySQL soporta distintos tipos de tablas, tales como ISAM, MyISAM,
InnoDB. De éstos, InnoDB es el tipo de tabla más importante (después del tipo predeterminado,
MyISAM).
Las tablas del tipo InnoDB están estructuradas de forma distinta que MyISAM, ya que se almacenan en
un sólo archivo en lugar de tres, y sus principales características son que permite trabajar con
transacciones, y definir reglas de integridad referencial.
Las transacciones aportan una fiabilidad superior a las bases de datos. Si disponemos de una serie de
consultas SQL que deben ejecutarse en conjunto, con el uso de transacciones podemos tener la certeza
de que nunca nos quedaremos a medio camino de su ejecución. De hecho, podríamos decir que las
transacciones aportan una característica de "deshacer" a las aplicaciones de bases de datos.
Para este fin, las tablas que soportan transacciones, como es el caso de InnoDB, son mucho más seguras
y fáciles de recuperar si se produce algún fallo en el servidor, ya que las consultas se ejecutan o no en su
totalidad. Por otra parte, las transacciones pueden hacer que las consultas tarden más tiempo en
ejecutarse.
Para asegurarnos que tenemos soporte para el tipo de tablas InnoDB podemos ejecutar la siguiente
sentencia:
SHOW VARIABLES LIKE '%innodb%';
+---------------------------------+------------+
| Variable_name | Value |
+---------------------------------+------------+
| have_innodb | YES |
En efecto, una de las principales características de las tablas del tipo InnoDB es que pueden trabajar con
transacciones, o sentencias SQL que son agrupadas como una sola. Un ejemplo típico de esto es una
transacción bancaria. Por ejemplo, si una cantidad de dinero es transferida de la cuenta de una persona
a otra, se requerirán por lo menos dos consultas:
UPDATE cuentas SET balance = balance - cantidad_transferida WHERE cliente = persona1;
UPDATE cuentas SET balance = balance + cantidad_transferida WHERE cliente = persona2;
Estas dos consultas deben trabajar bien, ¿pero que sucede si ocurre algún imprevisto y "se cae" el
sistema después de que se ejecuta la primer consulta, pero la segunda aún no se ha completado?. La
persona1 tendrá una cantidad de dinero removida de su cuenta, y creerá que ha realizado su pago, sin
embargo, la persona2 estará enfadada puesto que pensará que no se le ha depositado el dinero que le
deben. En este ejemplo tan sencillo se ilustra la necesidad de que las consultas sean ejecutadas de
manera conjunta, o en su caso, que no se ejecute ninguna de ellas. Es aquí donde las transacciones
toman un papel muy importante.
Los pasos para usar transacciones en MySQL son:
* Iniciar una transacción 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 transacción con el uso de la sentencia
COMMIT. Únicamente cuando se procesa un COMMIT los cambios hechos por las consultas serán
permanentes.
* Si sucede algún 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.
Crear una tabla especificando que es InnoDB:
CREATE TABLE innotest (campo INT NOT NULL PRIMARY KEY) TYPE = InnoDB;
INSERT INTO innotestVALUES(1);
INSERT INTO innotestVALUES(2);
INSERT INTO innotest VALUES(3);
SELECT * FROM innotest;
BEGIN;
INSERT INTO innotestVALUES(4);
SELECT * FROM innotest;
Si en este momento ejecutamos un ROLLBACK, la transacción no será completada, y los cambios
realizados sobre la tabla no tendrán efecto.
ROLLBACK;
SELECT * FROM innotest;
Ahora vamos a ver que sucede si perdemos la conexión al servidor antes de que la transacción sea
completada.
BEGIN;
INSERT INTO innotest VALUES(4);
SELECT * FROM innotest;
Detener el servicio de mysql.
Cuando obtengamos de nuevo la conexión, podemos verificar que el registro no se insertó, ya que la
transacción no fue completada.
SELECT * FROM innotest;
Ahora vamos a repetir la sentencia INSERT ejecutada anteriormente, pero con un COMMIT.
BEGIN;
INSERT INTO innotestVALUES(4);
COMMIT;
Una vez que hacemos un COMMIT, la transacción es completada, y todas las sentencias SQL que han
sido ejecutadas previamente afectan de manera permanente a las tablas de la base de datos.
SELECT * FROM innotest;
Lecturas consistentes
Por default, las tablas InnoDB ejecutan un lectura consistente (consistentread). Esto significa que
cuando una sentencia SELECT es ejecutada, MySQL regresa los valores presentes en la base de datos
hasta la transacción más reciente que ha sido completada. Si alguna transacción está en progreso, los
cambios hechos por alguna sentencia INSERT o UPDATE no serán reflejados. Sin embargo, existe una
excepción: las transacciones abiertas si pueden ver sus propios cambios. Para demostrar esto,
necesitamos establecer dos conexiones al servidor MySQL.
Primero agregaremos un registro dentro de una transacción con la primera conexión:
BEGIN;
INSERT INTO innotestVALUES(5);
Ahora, desde la segunda conexión consultamos los datos de nuestra tabla.
SELECT * FROM innotest;
Como se puede observar, el registro que hemos insertado desde la 1ra. conexión no es regresado
puesto que forma parte de una transacción que no ha sido completada. Ahora, desde la 1ra. conexión
ejecutamos la misma consulta SELECT.
SELECT * FROM innotest;
COMMIT;
Después de completar la transacción con una sentencia COMMIT en la 1ra. conexión podremos verificar
que desde la 2da. conexión los cambios ya son visibles.
SELECT * FROM innotest;
Crear una sencilla tabla llamada ventas que sea del tipo InnoDB.
CREATE TABLE ventas(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
producto VARCHAR(30) NOT NULL,
cantidad TINYINT NOT NULL) TYPE = InnoDB;
INSERT INTO ventasVALUES(0,'Gansito marinela',3);
SELECT * FROM ventas;
Ahora vamos a iniciar una transacción con la sentencia BEGIN.
BEGIN;
UPDATE ventas SET cantidad=4 WHERE id=1;
Verificamos que los cambios han sucedido.
SELECT * FROM ventas;
Si queremos deshacer los cambios, entonces ejecutamos un ROLLBACK.
ROLLBACK;
Verificamos que se deshicieron los cambios.
SELECT * FROM ventas;
Vamos a actualizar el registro usando otra transacción.
BEGIN;
UPDATE ventas SET cantidad=2 WHERE id=1;
SELECT * FROM ventas;
Vamos a confirmar que deseamos los cambios.
COMMIT;
En este momento los cambios son permanentes y definitivos.
SELECT * FROM ventas;

Más contenido relacionado

PPTX
Bitácora de base de datos
PPTX
Taller de Base de Datos - Unidad 6 SQL procedural
PDF
Procedimientos almacenados en MySQL
PPT
Método de Ordenamiento Sort Shell
PPTX
Base de datos Transaccional
PPT
Transaccion
PPTX
Taller de Base de datos - Unidad 1 SGBD introduccion
DOCX
Transacciones en MySQL
Bitácora de base de datos
Taller de Base de Datos - Unidad 6 SQL procedural
Procedimientos almacenados en MySQL
Método de Ordenamiento Sort Shell
Base de datos Transaccional
Transaccion
Taller de Base de datos - Unidad 1 SGBD introduccion
Transacciones en MySQL

La actualidad más candente (20)

PPT
Estructuras repetitivas
PPTX
Procedimientos almacenados
PPT
ESTRUCTURAS REPETITIVAS
PPTX
UML Básico - Casos de uso y Clases
PPTX
3. algoritmos de ordenamiento interno
PPTX
Eficiencia de algoritmos - Vanessa Ramirez
PPTX
Taller de Base de Datos - Unidad 7 Conectividad
PPTX
Modelos y capas de la ingenieria de software
DOCX
Ejemplo de uno a uno
PPTX
Taller de Base de Datos - Unidad 5 transacciones
PPT
B. manejo de concurrencia
PPTX
TRANSACCIONES
DOCX
Protocolos, estandares y tipos de modem
DOCX
control de concurrencia
DOCX
Replicación con sql server
PPTX
Normalización de la base de datos (3 formas normales)
PDF
Integridad de base de datos
PPTX
Programación 3: clases derivadas y polimorfismo
PDF
PROGRAMACIÓN ORIENTADA A OBJETOS
Estructuras repetitivas
Procedimientos almacenados
ESTRUCTURAS REPETITIVAS
UML Básico - Casos de uso y Clases
3. algoritmos de ordenamiento interno
Eficiencia de algoritmos - Vanessa Ramirez
Taller de Base de Datos - Unidad 7 Conectividad
Modelos y capas de la ingenieria de software
Ejemplo de uno a uno
Taller de Base de Datos - Unidad 5 transacciones
B. manejo de concurrencia
TRANSACCIONES
Protocolos, estandares y tipos de modem
control de concurrencia
Replicación con sql server
Normalización de la base de datos (3 formas normales)
Integridad de base de datos
Programación 3: clases derivadas y polimorfismo
PROGRAMACIÓN ORIENTADA A OBJETOS
Publicidad

Destacado (7)

PPTX
Transacciones base de datos
PPTX
Transacciones
PPTX
Arquitectura de oracle
PPTX
Trabajo 2 transacciones en base de datos
DOCX
Ejercicio 2 transacciones
PDF
BASE DE DATOS DISTRIBUIDAS
PDF
Transacciones
Transacciones base de datos
Transacciones
Arquitectura de oracle
Trabajo 2 transacciones en base de datos
Ejercicio 2 transacciones
BASE DE DATOS DISTRIBUIDAS
Transacciones
Publicidad

Similar a Transacciones en mysql (20)

PDF
Commit y rollback
PPTX
Diseño & Procesamiento de transacciones
PDF
Practica- Transacciones y Concurrencia en Oracle y MySQL
PPTX
Transacciones
PPTX
Transacciones
PPT
Actualización de bases de datos en MySQL
PPTX
Transacciones
PDF
Parte 08 my sql
PPTX
PPTX
Sintaxis de START TRANSACTION
PDF
89 Php. Tablas Inno Db
PPTX
PPTX
Definición de los modos de operación de un SGBD. (alta, baja, recovery) y c...
DOCX
Transacciones en transact sql
PPTX
PPTX
Manipulacion de Datos SQL cap10
PPT
PPSX
Curso SQL - Leccion 10
Commit y rollback
Diseño & Procesamiento de transacciones
Practica- Transacciones y Concurrencia en Oracle y MySQL
Transacciones
Transacciones
Actualización de bases de datos en MySQL
Transacciones
Parte 08 my sql
Sintaxis de START TRANSACTION
89 Php. Tablas Inno Db
Definición de los modos de operación de un SGBD. (alta, baja, recovery) y c...
Transacciones en transact sql
Manipulacion de Datos SQL cap10
Curso SQL - Leccion 10

Transacciones en mysql

  • 1. Transacciones en MYSQL El servidor de bases de datos MySQL soporta distintos tipos de tablas, tales como ISAM, MyISAM, InnoDB. De éstos, InnoDB es el tipo de tabla más importante (después del tipo predeterminado, MyISAM). Las tablas del tipo InnoDB están estructuradas de forma distinta que MyISAM, ya que se almacenan en un sólo archivo en lugar de tres, y sus principales características son que permite trabajar con transacciones, y definir reglas de integridad referencial. Las transacciones aportan una fiabilidad superior a las bases de datos. Si disponemos de una serie de consultas SQL que deben ejecutarse en conjunto, con el uso de transacciones podemos tener la certeza de que nunca nos quedaremos a medio camino de su ejecución. De hecho, podríamos decir que las transacciones aportan una característica de "deshacer" a las aplicaciones de bases de datos. Para este fin, las tablas que soportan transacciones, como es el caso de InnoDB, son mucho más seguras y fáciles de recuperar si se produce algún fallo en el servidor, ya que las consultas se ejecutan o no en su totalidad. Por otra parte, las transacciones pueden hacer que las consultas tarden más tiempo en ejecutarse. Para asegurarnos que tenemos soporte para el tipo de tablas InnoDB podemos ejecutar la siguiente sentencia: SHOW VARIABLES LIKE '%innodb%'; +---------------------------------+------------+ | Variable_name | Value | +---------------------------------+------------+ | have_innodb | YES | En efecto, una de las principales características de las tablas del tipo InnoDB es que pueden trabajar con transacciones, o sentencias SQL que son agrupadas como una sola. Un ejemplo típico de esto es una transacción bancaria. Por ejemplo, si una cantidad de dinero es transferida de la cuenta de una persona a otra, se requerirán por lo menos dos consultas: UPDATE cuentas SET balance = balance - cantidad_transferida WHERE cliente = persona1; UPDATE cuentas SET balance = balance + cantidad_transferida WHERE cliente = persona2; Estas dos consultas deben trabajar bien, ¿pero que sucede si ocurre algún imprevisto y "se cae" el sistema después de que se ejecuta la primer consulta, pero la segunda aún no se ha completado?. La
  • 2. persona1 tendrá una cantidad de dinero removida de su cuenta, y creerá que ha realizado su pago, sin embargo, la persona2 estará enfadada puesto que pensará que no se le ha depositado el dinero que le deben. En este ejemplo tan sencillo se ilustra la necesidad de que las consultas sean ejecutadas de manera conjunta, o en su caso, que no se ejecute ninguna de ellas. Es aquí donde las transacciones toman un papel muy importante. Los pasos para usar transacciones en MySQL son: * Iniciar una transacción 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 transacción con el uso de la sentencia COMMIT. Únicamente cuando se procesa un COMMIT los cambios hechos por las consultas serán permanentes. * Si sucede algún 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. Crear una tabla especificando que es InnoDB: CREATE TABLE innotest (campo INT NOT NULL PRIMARY KEY) TYPE = InnoDB; INSERT INTO innotestVALUES(1); INSERT INTO innotestVALUES(2); INSERT INTO innotest VALUES(3); SELECT * FROM innotest; BEGIN; INSERT INTO innotestVALUES(4); SELECT * FROM innotest; Si en este momento ejecutamos un ROLLBACK, la transacción no será completada, y los cambios realizados sobre la tabla no tendrán efecto. ROLLBACK; SELECT * FROM innotest; Ahora vamos a ver que sucede si perdemos la conexión al servidor antes de que la transacción sea completada. BEGIN; INSERT INTO innotest VALUES(4);
  • 3. SELECT * FROM innotest; Detener el servicio de mysql. Cuando obtengamos de nuevo la conexión, podemos verificar que el registro no se insertó, ya que la transacción no fue completada. SELECT * FROM innotest; Ahora vamos a repetir la sentencia INSERT ejecutada anteriormente, pero con un COMMIT. BEGIN; INSERT INTO innotestVALUES(4); COMMIT; Una vez que hacemos un COMMIT, la transacción es completada, y todas las sentencias SQL que han sido ejecutadas previamente afectan de manera permanente a las tablas de la base de datos. SELECT * FROM innotest; Lecturas consistentes Por default, las tablas InnoDB ejecutan un lectura consistente (consistentread). Esto significa que cuando una sentencia SELECT es ejecutada, MySQL regresa los valores presentes en la base de datos hasta la transacción más reciente que ha sido completada. Si alguna transacción está en progreso, los cambios hechos por alguna sentencia INSERT o UPDATE no serán reflejados. Sin embargo, existe una excepción: las transacciones abiertas si pueden ver sus propios cambios. Para demostrar esto, necesitamos establecer dos conexiones al servidor MySQL. Primero agregaremos un registro dentro de una transacción con la primera conexión: BEGIN; INSERT INTO innotestVALUES(5); Ahora, desde la segunda conexión consultamos los datos de nuestra tabla. SELECT * FROM innotest; Como se puede observar, el registro que hemos insertado desde la 1ra. conexión no es regresado puesto que forma parte de una transacción que no ha sido completada. Ahora, desde la 1ra. conexión ejecutamos la misma consulta SELECT. SELECT * FROM innotest;
  • 4. COMMIT; Después de completar la transacción con una sentencia COMMIT en la 1ra. conexión podremos verificar que desde la 2da. conexión los cambios ya son visibles. SELECT * FROM innotest; Crear una sencilla tabla llamada ventas que sea del tipo InnoDB. CREATE TABLE ventas( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, producto VARCHAR(30) NOT NULL, cantidad TINYINT NOT NULL) TYPE = InnoDB; INSERT INTO ventasVALUES(0,'Gansito marinela',3); SELECT * FROM ventas; Ahora vamos a iniciar una transacción con la sentencia BEGIN. BEGIN; UPDATE ventas SET cantidad=4 WHERE id=1; Verificamos que los cambios han sucedido. SELECT * FROM ventas; Si queremos deshacer los cambios, entonces ejecutamos un ROLLBACK. ROLLBACK; Verificamos que se deshicieron los cambios. SELECT * FROM ventas; Vamos a actualizar el registro usando otra transacción. BEGIN; UPDATE ventas SET cantidad=2 WHERE id=1; SELECT * FROM ventas; Vamos a confirmar que deseamos los cambios. COMMIT; En este momento los cambios son permanentes y definitivos. SELECT * FROM ventas;