SlideShare una empresa de Scribd logo
Basesde Datos 403
Transacciones
1
Ejercicio 2 Transacciones
mysql> CREATE TABLE innotest (campo INT NOT NULL PRIMARY KEY) TYPE = InnoDB;
Query OK, 0 rows affected (0.10 sec)
mysql> INSERT INTO innotest VALUES(1);
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO innotest VALUES(2);
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO innotest VALUES(3);
Query OK, 1 row affected (0.04 sec)
mysql> SELECT * FROM innotest;
+-------+
| campo |
+-------+
| 1 |
| 2 |
| 3 |
+-------+
3 rows in set (0.00 sec)
De acuerdo, nada espectacular. Ahora cómo usar transacciones.
mysql> BEGIN;
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO innotest VALUES(4);
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM innotest;
+-------+
| campo |
+-------+
| 1 |
| 2 |
| 3 |
| 4 |
+-------+
4 rows in set (0.00 sec)
Si en este momento se ejecuta un ROLLBACK, la transacción no será completada, y los cambios realizados sobre la tabla
no tendrán efecto.
mysql> ROLLBACK;
Query OK, 0 rows affected (0.06 sec)
mysql> SELECT * FROM innotest;
+-------+
| campo |
+-------+
| 1 |
| 2 |
| 3 |
+-------+
3 rows in set (0.00 sec)
Ahora qué sucede si se pierde la conexión al servidor antes de que la transacción sea completada.
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO innotest VALUES(4);
Query OK, 1 row affected (0.00 sec)
Basesde Datos 403
Transacciones
2
mysql> SELECT * FROM innotest;
+-------+
| campo |
+-------+
| 1 |
| 2 |
| 3 |
| 4 |
+-------+
4 rows in set (0.00 sec)
mysql> EXIT;
Bye
Cuando se obtenga de nuevo la conexión, podemos verificar que el registro no se insertó, ya que la transacción no fue
completada.
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 449 to server version: 4.0.13
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
mysql> SELECT * FROM innotest;
+-------+
| campo |
+-------+
| 1 |
| 2 |
| 3 |
+-------+
3 rows in set (0.00 sec)
Ahora repetir la sentencia INSERT ejecutada anteriormente, pero haremos un COMMIT antes de perder la conexión al
servidor al salir del monitor de MySQL.
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO innotest VALUES(4);
Query OK, 1 row affected (0.00 sec)
mysql> COMMIT;
Query OK, 0 rows affected (0.02 sec)
mysql> EXIT;
Bye
Una vez que se comete o confirma la transacción con 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.
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 450 to server version: 4.0.13
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
mysql> SELECT * FROM innotest;
+-------+
| campo |
+-------+
| 1 |
| 2 |
| 3 |
| 4 |
+-------+
4 rows in set (0.00 sec)
Basesde Datos 403
Transacciones
3
Lecturas consistentes
Por default, las tablas InnoDB ejecutan un lectura consistente (consistent read). 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, se necesita establecer dos conexiones al servidor MySQL.
Abrir dos sesiones de mysql a la vez:
Agregar un registro dentro de una transacción desde la primera conexión:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 524 to server version: 4.0.13
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO innotest VALUES(5);
Query OK, 1 row affected (0.00 sec)
Ahora, desde una segunda conexión se consultan los datos de nuestra tabla.
Basesde Datos 403
Transacciones
4
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 525 to server version: 4.0.13
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
mysql> SELECT * FROM innotest;
+-------+
| campo |
+-------+
| 1 |
| 2 |
| 3 |
| 4 |
+-------+
4 rows in set (0.00 sec)
Como se puede observar, el registro que se ha insertado desde la primera conexión no es regresado puesto que forma
parte de una transacción que no ha sido completada. Ahora, desde la primera conexión se ejecuta la misma consulta
SELECT.
mysql> SELECT * FROM innotest;
+-------+
| campo |
+-------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+-------+
5 rows in set (0.00 sec)
Después de completar la transacción con una sentencia COMMIT en la 1ra conexión se puede verificar que desde la 2da
conexión los cambios ya son visibles.
mysql> SELECT * FROM innotest;
+-------+
| campo |
+-------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+-------+
5 rows in set (0.00 sec)
Otro ejemplo
En el ejemplo anterior se ha usado únicamente sentencias INSERT, sin embargo, sucede lo mismo con sentencias
UPDATE o DELETE. Crear una sencilla tabla llamada ventas.
mysql> CREATE TABLE ventas(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
-> producto VARCHAR(30) NOT NULL, cantidad TINYINT NOT NULL) TYPE = InnoDB;
Query OK, 0 rows affected (0.96 sec)
Insertar un registro.
mysql> INSERT INTO ventas VALUES(0,'Gansito marinela',3);
Query OK, 1 row affected (0.16 sec)
Basesde Datos 403
Transacciones
5
mysql> SELECT * FROM ventas;
+----+------------------+----------+
| id | producto | cantidad |
+----+------------------+----------+
| 1 | Gansito marinela | 3 |
+----+------------------+----------+
1 row in set (0.01 sec)
Ahora iniciar una transacción con la sentencia BEGIN.
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
Actualizar elregistro.
mysql> UPDATE ventas SET cantidad=4 WHERE id=1;
Query OK, 1 row affected (0.07 sec)
Lgneas correspondientes: 1 Cambiadas: 1 Avisos: 0
Verificar que los cambios han sucedido.
mysql> SELECT * FROM ventas;
+----+------------------+----------+
| id | producto | cantidad |
+----+------------------+----------+
| 1 | Gansito marinela | 4 |
+----+------------------+----------+
1 row in set (0.00 sec)
Si se quiere deshacer los cambios, entonces ejecutamos un ROLLBACK.
mysql> ROLLBACK;
Query OK, 0 rows affected (0.06 sec)
Verificar que se deshicieron los cambios.
mysql> SELECT * FROM ventas;
+----+------------------+----------+
| id | producto | cantidad |
+----+------------------+----------+
| 1 | Gansito marinela | 3 |
+----+------------------+----------+
1 row in set (0.00 sec)
Actualizar elregistro usando otra transacción.
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE ventas SET cantidad=2 WHERE id=1;
Query OK, 1 row affected (0.00 sec)
Líneas correspondientes: 1 Cambiadas: 1 Avisos: 0
mysql> SELECT * FROM ventas;
+----+------------------+----------+
| id | producto | cantidad |
+----+------------------+----------+
| 1 | Gansito marinela | 2 |
+----+------------------+----------+
1 row in set (0.00 sec)
Confirmar la transacción. Después de ejecutar el COMMIT los cambios serán permanentes y definitivos.
mysql> COMMIT;
Query OK, 0 rows affected (0.05 sec)
mysql> SELECT * FROM ventas;
+----+------------------+----------+
| id | producto | cantidad |
Basesde Datos 403
Transacciones
6
+----+------------------+----------+
| 1 | Gansito marinela | 2 |
+----+------------------+----------+
1 row in set (0.00 sec)
Bibliografía:
Mysql-Hispano
Artículo:Transacciones

Más contenido relacionado

La actualidad más candente

Objeto relacional bases datos 2
Objeto relacional bases datos 2Objeto relacional bases datos 2
Objeto relacional bases datos 2Velmuz Buzz
 
Funciones y procedimientos en SQL
Funciones y procedimientos en SQLFunciones y procedimientos en SQL
Funciones y procedimientos en SQLRonald Rivas
 
Normalizacion de base de datos
Normalizacion de base de datosNormalizacion de base de datos
Normalizacion de base de datos
Sergio Sanchez
 
Listas doblemente enlazadas C++ UP
Listas doblemente enlazadas C++ UPListas doblemente enlazadas C++ UP
Listas doblemente enlazadas C++ UP
MiguelGomez371
 
3. algoritmos de ordenamiento interno
3. algoritmos de ordenamiento interno3. algoritmos de ordenamiento interno
3. algoritmos de ordenamiento interno
Fernando Solis
 
Programación 3: listas enlazadas
Programación 3: listas enlazadasProgramación 3: listas enlazadas
Programación 3: listas enlazadas
Angel Vázquez Patiño
 
SQL Complete Tutorial. All Topics Covered
SQL Complete Tutorial. All Topics CoveredSQL Complete Tutorial. All Topics Covered
SQL Complete Tutorial. All Topics Covered
Danish Mehraj
 
Manual sqlserver2008 final
Manual sqlserver2008 finalManual sqlserver2008 final
Manual sqlserver2008 finalAlex Vasquez
 
TRIGGERS O DISPARADORES
TRIGGERS O DISPARADORESTRIGGERS O DISPARADORES
TRIGGERS O DISPARADORES
Lisbeth Ocaña Bueno
 
Procedimientos almacenados
Procedimientos almacenadosProcedimientos almacenados
Procedimientos almacenados
thalia margarita serrano diaz
 
Ejercicios uml
Ejercicios umlEjercicios uml
Fundamentos de Base de Datos
Fundamentos de Base de DatosFundamentos de Base de Datos
Fundamentos de Base de Datos
Saulo Aizprua
 
Cuadro Comparativo de Algoritmos
Cuadro Comparativo de AlgoritmosCuadro Comparativo de Algoritmos
Cuadro Comparativo de AlgoritmosJonathan Higuera
 
Programación MySQL-Ejercicios
Programación MySQL-EjerciciosProgramación MySQL-Ejercicios
Programación MySQL-Ejerciciostestgrupocomex
 
Archivo secuencial indexado
Archivo secuencial indexadoArchivo secuencial indexado
Archivo secuencial indexado
lesster ostorga
 
Tópicos Avanzados de Programación - Unidad 4 Acceso a datos
Tópicos Avanzados de Programación - Unidad 4 Acceso a datosTópicos Avanzados de Programación - Unidad 4 Acceso a datos
Tópicos Avanzados de Programación - Unidad 4 Acceso a datos
José Antonio Sandoval Acosta
 
Tipos abstractos de datos
Tipos abstractos de datosTipos abstractos de datos
Tipos abstractos de datosJose Armando
 

La actualidad más candente (20)

Sql presentacion
Sql presentacionSql presentacion
Sql presentacion
 
Objeto relacional bases datos 2
Objeto relacional bases datos 2Objeto relacional bases datos 2
Objeto relacional bases datos 2
 
Funciones y procedimientos en SQL
Funciones y procedimientos en SQLFunciones y procedimientos en SQL
Funciones y procedimientos en SQL
 
Normalizacion de base de datos
Normalizacion de base de datosNormalizacion de base de datos
Normalizacion de base de datos
 
Listas doblemente enlazadas C++ UP
Listas doblemente enlazadas C++ UPListas doblemente enlazadas C++ UP
Listas doblemente enlazadas C++ UP
 
Guia normalización
Guia normalizaciónGuia normalización
Guia normalización
 
3. algoritmos de ordenamiento interno
3. algoritmos de ordenamiento interno3. algoritmos de ordenamiento interno
3. algoritmos de ordenamiento interno
 
Programación 3: listas enlazadas
Programación 3: listas enlazadasProgramación 3: listas enlazadas
Programación 3: listas enlazadas
 
SQL Complete Tutorial. All Topics Covered
SQL Complete Tutorial. All Topics CoveredSQL Complete Tutorial. All Topics Covered
SQL Complete Tutorial. All Topics Covered
 
Manual sqlserver2008 final
Manual sqlserver2008 finalManual sqlserver2008 final
Manual sqlserver2008 final
 
TRIGGERS O DISPARADORES
TRIGGERS O DISPARADORESTRIGGERS O DISPARADORES
TRIGGERS O DISPARADORES
 
Procedimientos almacenados
Procedimientos almacenadosProcedimientos almacenados
Procedimientos almacenados
 
Ejercicios uml
Ejercicios umlEjercicios uml
Ejercicios uml
 
Fundamentos de Base de Datos
Fundamentos de Base de DatosFundamentos de Base de Datos
Fundamentos de Base de Datos
 
Cuadro Comparativo de Algoritmos
Cuadro Comparativo de AlgoritmosCuadro Comparativo de Algoritmos
Cuadro Comparativo de Algoritmos
 
Programación MySQL-Ejercicios
Programación MySQL-EjerciciosProgramación MySQL-Ejercicios
Programación MySQL-Ejercicios
 
Archivo secuencial indexado
Archivo secuencial indexadoArchivo secuencial indexado
Archivo secuencial indexado
 
Tópicos Avanzados de Programación - Unidad 4 Acceso a datos
Tópicos Avanzados de Programación - Unidad 4 Acceso a datosTópicos Avanzados de Programación - Unidad 4 Acceso a datos
Tópicos Avanzados de Programación - Unidad 4 Acceso a datos
 
modelo entidad-relacion
modelo entidad-relacionmodelo entidad-relacion
modelo entidad-relacion
 
Tipos abstractos de datos
Tipos abstractos de datosTipos abstractos de datos
Tipos abstractos de datos
 

Similar a Ejercicio 2 transacciones

Parte 08 my sql
Parte 08 my sqlParte 08 my sql
Parte 08 my sql
rosmeriramos
 
Mysql
MysqlMysql
Tutorial básico de my sql
Tutorial básico de my sqlTutorial básico de my sql
Tutorial básico de my sql
Guiro Lin
 
Funciones numéricas, de fecha y hora en MySQL
Funciones numéricas,  de fecha y hora en MySQLFunciones numéricas,  de fecha y hora en MySQL
Funciones numéricas, de fecha y hora en MySQL
Ing-D-SW-TorresKhano--ME
 
Tutorial mysql-basico
Tutorial mysql-basicoTutorial mysql-basico
Tutorial mysql-basico
Guiro Lin
 
Tutorial mysql
Tutorial mysqlTutorial mysql
Tutorial mysql
kyaalena
 
Manualmysql
ManualmysqlManualmysql
Manualmysqlmi casa
 
Tutorial mysql
Tutorial mysqlTutorial mysql
Tutorial mysqloskrsolis
 
Tutorial mysql
Tutorial mysqlTutorial mysql
Tutorial mysqloskrsolis
 
Introducción a MySql
Introducción a MySqlIntroducción a MySql
Introducción a MySql
Cristian Zapata Manríquez
 
Manualitosqlserver
ManualitosqlserverManualitosqlserver
Manualitosqlserver
Oca srl
 
Material Clase BDD: Diseño de una Base de Datos
Material Clase BDD: Diseño de una Base de DatosMaterial Clase BDD: Diseño de una Base de Datos
Material Clase BDD: Diseño de una Base de Datos
liras loca
 
Sesión03 - Creación de objetos (Oracle)
Sesión03 - Creación de objetos (Oracle)Sesión03 - Creación de objetos (Oracle)
Sesión03 - Creación de objetos (Oracle)
José Toro
 
Php06 instalacion my_sql
Php06 instalacion my_sqlPhp06 instalacion my_sql
Php06 instalacion my_sqlJulio Pari
 

Similar a Ejercicio 2 transacciones (20)

Ejercicios de transacciones
Ejercicios de transaccionesEjercicios de transacciones
Ejercicios de transacciones
 
Parte 08 my sql
Parte 08 my sqlParte 08 my sql
Parte 08 my sql
 
Mysql
MysqlMysql
Mysql
 
MANUAL
MANUALMANUAL
MANUAL
 
Tutorial básico de my sql
Tutorial básico de my sqlTutorial básico de my sql
Tutorial básico de my sql
 
Funciones numéricas, de fecha y hora en MySQL
Funciones numéricas,  de fecha y hora en MySQLFunciones numéricas,  de fecha y hora en MySQL
Funciones numéricas, de fecha y hora en MySQL
 
Tutorial mysql-basico
Tutorial mysql-basicoTutorial mysql-basico
Tutorial mysql-basico
 
Tutorial mysql
Tutorial mysqlTutorial mysql
Tutorial mysql
 
Manualmysql
ManualmysqlManualmysql
Manualmysql
 
Mysql
MysqlMysql
Mysql
 
Tutorial mysql
Tutorial mysqlTutorial mysql
Tutorial mysql
 
Tutorial mysql
Tutorial mysqlTutorial mysql
Tutorial mysql
 
Tutorial mysql
Tutorial mysqlTutorial mysql
Tutorial mysql
 
Tutorial mysql
Tutorial mysqlTutorial mysql
Tutorial mysql
 
Introducción a MySql
Introducción a MySqlIntroducción a MySql
Introducción a MySql
 
Tema 7 Trabajando Con Mysql
Tema 7 Trabajando Con MysqlTema 7 Trabajando Con Mysql
Tema 7 Trabajando Con Mysql
 
Manualitosqlserver
ManualitosqlserverManualitosqlserver
Manualitosqlserver
 
Material Clase BDD: Diseño de una Base de Datos
Material Clase BDD: Diseño de una Base de DatosMaterial Clase BDD: Diseño de una Base de Datos
Material Clase BDD: Diseño de una Base de Datos
 
Sesión03 - Creación de objetos (Oracle)
Sesión03 - Creación de objetos (Oracle)Sesión03 - Creación de objetos (Oracle)
Sesión03 - Creación de objetos (Oracle)
 
Php06 instalacion my_sql
Php06 instalacion my_sqlPhp06 instalacion my_sql
Php06 instalacion my_sql
 

Más de María Luisa Velasco (20)

Respaldando bd
Respaldando bdRespaldando bd
Respaldando bd
 
Sql
SqlSql
Sql
 
Sql
SqlSql
Sql
 
Guia eejerciciospracticos
Guia eejerciciospracticosGuia eejerciciospracticos
Guia eejerciciospracticos
 
Ejercicios normalización
Ejercicios normalizaciónEjercicios normalización
Ejercicios normalización
 
Normalizacion
NormalizacionNormalizacion
Normalizacion
 
Guia eejerciciospracticos
Guia eejerciciospracticosGuia eejerciciospracticos
Guia eejerciciospracticos
 
Guia eejerciciospracticos
Guia eejerciciospracticosGuia eejerciciospracticos
Guia eejerciciospracticos
 
Guia eejerciciospracticos
Guia eejerciciospracticosGuia eejerciciospracticos
Guia eejerciciospracticos
 
Modulos sgbd
Modulos sgbdModulos sgbd
Modulos sgbd
 
Guia eejerciciospracticos
Guia eejerciciospracticosGuia eejerciciospracticos
Guia eejerciciospracticos
 
Induccion fundbd2012
Induccion fundbd2012Induccion fundbd2012
Induccion fundbd2012
 
Induccion fundbd2012
Induccion fundbd2012Induccion fundbd2012
Induccion fundbd2012
 
Guia eejerciciospracticos
Guia eejerciciospracticosGuia eejerciciospracticos
Guia eejerciciospracticos
 
Paradigmas de programación
Paradigmas de programaciónParadigmas de programación
Paradigmas de programación
 
Proyecto final de algoritmica
Proyecto final de algoritmicaProyecto final de algoritmica
Proyecto final de algoritmica
 
Ejercicios arreglos4
Ejercicios arreglos4Ejercicios arreglos4
Ejercicios arreglos4
 
Ejercicios arreglos2
Ejercicios arreglos2Ejercicios arreglos2
Ejercicios arreglos2
 
Seguridad bd
Seguridad bdSeguridad bd
Seguridad bd
 
Ejercicios3parte
Ejercicios3parteEjercicios3parte
Ejercicios3parte
 

Ejercicio 2 transacciones

  • 1. Basesde Datos 403 Transacciones 1 Ejercicio 2 Transacciones mysql> CREATE TABLE innotest (campo INT NOT NULL PRIMARY KEY) TYPE = InnoDB; Query OK, 0 rows affected (0.10 sec) mysql> INSERT INTO innotest VALUES(1); Query OK, 1 row affected (0.08 sec) mysql> INSERT INTO innotest VALUES(2); Query OK, 1 row affected (0.01 sec) mysql> INSERT INTO innotest VALUES(3); Query OK, 1 row affected (0.04 sec) mysql> SELECT * FROM innotest; +-------+ | campo | +-------+ | 1 | | 2 | | 3 | +-------+ 3 rows in set (0.00 sec) De acuerdo, nada espectacular. Ahora cómo usar transacciones. mysql> BEGIN; Query OK, 0 rows affected (0.01 sec) mysql> INSERT INTO innotest VALUES(4); Query OK, 1 row affected (0.00 sec) mysql> SELECT * FROM innotest; +-------+ | campo | +-------+ | 1 | | 2 | | 3 | | 4 | +-------+ 4 rows in set (0.00 sec) Si en este momento se ejecuta un ROLLBACK, la transacción no será completada, y los cambios realizados sobre la tabla no tendrán efecto. mysql> ROLLBACK; Query OK, 0 rows affected (0.06 sec) mysql> SELECT * FROM innotest; +-------+ | campo | +-------+ | 1 | | 2 | | 3 | +-------+ 3 rows in set (0.00 sec) Ahora qué sucede si se pierde la conexión al servidor antes de que la transacción sea completada. mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO innotest VALUES(4); Query OK, 1 row affected (0.00 sec)
  • 2. Basesde Datos 403 Transacciones 2 mysql> SELECT * FROM innotest; +-------+ | campo | +-------+ | 1 | | 2 | | 3 | | 4 | +-------+ 4 rows in set (0.00 sec) mysql> EXIT; Bye Cuando se obtenga de nuevo la conexión, podemos verificar que el registro no se insertó, ya que la transacción no fue completada. Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 449 to server version: 4.0.13 Type 'help;' or 'h' for help. Type 'c' to clear the buffer. mysql> SELECT * FROM innotest; +-------+ | campo | +-------+ | 1 | | 2 | | 3 | +-------+ 3 rows in set (0.00 sec) Ahora repetir la sentencia INSERT ejecutada anteriormente, pero haremos un COMMIT antes de perder la conexión al servidor al salir del monitor de MySQL. mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO innotest VALUES(4); Query OK, 1 row affected (0.00 sec) mysql> COMMIT; Query OK, 0 rows affected (0.02 sec) mysql> EXIT; Bye Una vez que se comete o confirma la transacción con 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. Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 450 to server version: 4.0.13 Type 'help;' or 'h' for help. Type 'c' to clear the buffer. mysql> SELECT * FROM innotest; +-------+ | campo | +-------+ | 1 | | 2 | | 3 | | 4 | +-------+ 4 rows in set (0.00 sec)
  • 3. Basesde Datos 403 Transacciones 3 Lecturas consistentes Por default, las tablas InnoDB ejecutan un lectura consistente (consistent read). 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, se necesita establecer dos conexiones al servidor MySQL. Abrir dos sesiones de mysql a la vez: Agregar un registro dentro de una transacción desde la primera conexión: Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 524 to server version: 4.0.13 Type 'help;' or 'h' for help. Type 'c' to clear the buffer. mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO innotest VALUES(5); Query OK, 1 row affected (0.00 sec) Ahora, desde una segunda conexión se consultan los datos de nuestra tabla.
  • 4. Basesde Datos 403 Transacciones 4 Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 525 to server version: 4.0.13 Type 'help;' or 'h' for help. Type 'c' to clear the buffer. mysql> SELECT * FROM innotest; +-------+ | campo | +-------+ | 1 | | 2 | | 3 | | 4 | +-------+ 4 rows in set (0.00 sec) Como se puede observar, el registro que se ha insertado desde la primera conexión no es regresado puesto que forma parte de una transacción que no ha sido completada. Ahora, desde la primera conexión se ejecuta la misma consulta SELECT. mysql> SELECT * FROM innotest; +-------+ | campo | +-------+ | 1 | | 2 | | 3 | | 4 | | 5 | +-------+ 5 rows in set (0.00 sec) Después de completar la transacción con una sentencia COMMIT en la 1ra conexión se puede verificar que desde la 2da conexión los cambios ya son visibles. mysql> SELECT * FROM innotest; +-------+ | campo | +-------+ | 1 | | 2 | | 3 | | 4 | | 5 | +-------+ 5 rows in set (0.00 sec) Otro ejemplo En el ejemplo anterior se ha usado únicamente sentencias INSERT, sin embargo, sucede lo mismo con sentencias UPDATE o DELETE. Crear una sencilla tabla llamada ventas. mysql> CREATE TABLE ventas(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, -> producto VARCHAR(30) NOT NULL, cantidad TINYINT NOT NULL) TYPE = InnoDB; Query OK, 0 rows affected (0.96 sec) Insertar un registro. mysql> INSERT INTO ventas VALUES(0,'Gansito marinela',3); Query OK, 1 row affected (0.16 sec)
  • 5. Basesde Datos 403 Transacciones 5 mysql> SELECT * FROM ventas; +----+------------------+----------+ | id | producto | cantidad | +----+------------------+----------+ | 1 | Gansito marinela | 3 | +----+------------------+----------+ 1 row in set (0.01 sec) Ahora iniciar una transacción con la sentencia BEGIN. mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) Actualizar elregistro. mysql> UPDATE ventas SET cantidad=4 WHERE id=1; Query OK, 1 row affected (0.07 sec) Lgneas correspondientes: 1 Cambiadas: 1 Avisos: 0 Verificar que los cambios han sucedido. mysql> SELECT * FROM ventas; +----+------------------+----------+ | id | producto | cantidad | +----+------------------+----------+ | 1 | Gansito marinela | 4 | +----+------------------+----------+ 1 row in set (0.00 sec) Si se quiere deshacer los cambios, entonces ejecutamos un ROLLBACK. mysql> ROLLBACK; Query OK, 0 rows affected (0.06 sec) Verificar que se deshicieron los cambios. mysql> SELECT * FROM ventas; +----+------------------+----------+ | id | producto | cantidad | +----+------------------+----------+ | 1 | Gansito marinela | 3 | +----+------------------+----------+ 1 row in set (0.00 sec) Actualizar elregistro usando otra transacción. mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> UPDATE ventas SET cantidad=2 WHERE id=1; Query OK, 1 row affected (0.00 sec) Líneas correspondientes: 1 Cambiadas: 1 Avisos: 0 mysql> SELECT * FROM ventas; +----+------------------+----------+ | id | producto | cantidad | +----+------------------+----------+ | 1 | Gansito marinela | 2 | +----+------------------+----------+ 1 row in set (0.00 sec) Confirmar la transacción. Después de ejecutar el COMMIT los cambios serán permanentes y definitivos. mysql> COMMIT; Query OK, 0 rows affected (0.05 sec) mysql> SELECT * FROM ventas; +----+------------------+----------+ | id | producto | cantidad |
  • 6. Basesde Datos 403 Transacciones 6 +----+------------------+----------+ | 1 | Gansito marinela | 2 | +----+------------------+----------+ 1 row in set (0.00 sec) Bibliografía: Mysql-Hispano Artículo:Transacciones