Transacciones de MySQL e Integridad de Datos

MySQLMySQLBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, explorarás las transacciones de MySQL y su importancia para mantener la integridad de los datos. Aprenderás cómo utilizar transacciones para garantizar que una serie de operaciones SQL se traten como una única unidad de trabajo, de modo que todas tengan éxito o todas fallen juntas.

El laboratorio cubre cómo iniciar una transacción con BEGIN, insertar datos y confirmar la transacción para hacer los cambios permanentes, revertir una actualización fallida para descartar los cambios y utilizar puntos de guardado (savepoints) para reversiones parciales dentro de una transacción. Conectarás a un servidor MySQL, crearás una base de datos y una tabla, y luego practicarás estas operaciones relacionadas con las transacciones.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL mysql(("MySQL")) -.-> mysql/BasicKeywordsandStatementsGroup(["Basic Keywords and Statements"]) mysql/BasicKeywordsandStatementsGroup -.-> mysql/use_database("Database Selection") mysql/BasicKeywordsandStatementsGroup -.-> mysql/create_database("Database Creation") mysql/BasicKeywordsandStatementsGroup -.-> mysql/create_table("Table Creation") mysql/BasicKeywordsandStatementsGroup -.-> mysql/select("Data Retrieval") mysql/BasicKeywordsandStatementsGroup -.-> mysql/insert("Data Insertion") mysql/BasicKeywordsandStatementsGroup -.-> mysql/update("Data Update") subgraph Lab Skills mysql/use_database -.-> lab-550918{{"Transacciones de MySQL e Integridad de Datos"}} mysql/create_database -.-> lab-550918{{"Transacciones de MySQL e Integridad de Datos"}} mysql/create_table -.-> lab-550918{{"Transacciones de MySQL e Integridad de Datos"}} mysql/select -.-> lab-550918{{"Transacciones de MySQL e Integridad de Datos"}} mysql/insert -.-> lab-550918{{"Transacciones de MySQL e Integridad de Datos"}} mysql/update -.-> lab-550918{{"Transacciones de MySQL e Integridad de Datos"}} end

Iniciar una transacción con BEGIN

En este paso, aprenderás cómo iniciar una transacción en MySQL utilizando la declaración BEGIN. Las transacciones son un concepto fundamental en la gestión de bases de datos, ya que garantizan la integridad y consistencia de los datos. Una transacción es una secuencia de una o más operaciones SQL que se tratan como una única unidad de trabajo. O todas las operaciones dentro de la transacción tienen éxito, o ninguna de ellas lo hace.

Antes de sumergirnos en la parte práctica, entendamos por qué las transacciones son importantes. Imagina que estás transfiriendo dinero de una cuenta bancaria a otra. Esto implica dos operaciones: debitar la cantidad de la cuenta del remitente y acreditar la cantidad en la cuenta del destinatario. Si la primera operación tiene éxito pero la segunda falla (por ejemplo, debido a un bloqueo del sistema), el dinero se perdería. Las transacciones evitan tales inconsistencias al garantizar que ambas operaciones tengan éxito juntas o fallen juntas.

Para iniciar una transacción en MySQL, se utiliza la declaración BEGIN (o su alias START TRANSACTION). Esta declaración indica el inicio de una nueva transacción. Cualquier declaración SQL subsiguiente formará parte de esta transacción hasta que se COMMIT los cambios (haciéndolos permanentes) o se ROLLBACK los cambios (descartándolos).

Comencemos conectándonos al servidor MySQL. Abre tu terminal y ejecuta el siguiente comando:

mysql -u root -p

Se te pedirá la contraseña de root. Ingresa la contraseña que estableciste durante la instalación de MySQL. Si no has establecido una contraseña, simplemente presiona Enter.

Ahora que estás conectado al servidor MySQL, creemos una base de datos y una tabla con las que trabajar. Ejecuta las siguientes declaraciones SQL:

CREATE DATABASE IF NOT EXISTS labex_db;
USE labex_db;
CREATE TABLE IF NOT EXISTS accounts (
    id INT PRIMARY KEY AUTO_INCREMENT,
    account_number VARCHAR(50) NOT NULL,
    balance DECIMAL(10, 2) NOT NULL
);

Estos comandos crean una base de datos llamada labex_db y una tabla llamada accounts dentro de esa base de datos. La tabla accounts tiene tres columnas: id, account_number y balance.

A continuación, insertemos algunos datos iniciales en la tabla accounts:

INSERT INTO accounts (account_number, balance) VALUES
('ACC001', 1000.00),
('ACC002', 500.00);

Ahora, iniciemos una transacción. Ejecuta la siguiente declaración:

BEGIN;

Este comando inicia una nueva transacción. Cualquier declaración SQL subsiguiente formará parte de esta transacción.

Para verificar que la transacción ha comenzado, puedes ejecutar una simple declaración de actualización. Por ejemplo, deduzcamos 100 de la cuenta 'ACC001':

UPDATE accounts SET balance = balance - 100 WHERE account_number = 'ACC001';

Ahora, verifica el saldo de 'ACC001':

SELECT * FROM accounts WHERE account_number = 'ACC001';

Deberías ver que el saldo de 'ACC001' se ha actualizado a 900.00. Sin embargo, estos cambios aún no son permanentes. Solo son visibles dentro de la transacción actual. Para hacer los cambios permanentes, necesitarías COMMIT la transacción, lo cual aprenderás en el siguiente paso. Si cerraras la conexión a MySQL ahora sin confirmar o revertir, los cambios se perderían.

Insertar datos y confirmar la transacción

En el paso anterior, aprendiste cómo iniciar una transacción utilizando la declaración BEGIN. Ahora, aprenderás cómo insertar datos dentro de una transacción y luego confirmar la transacción para hacer los cambios permanentes.

Continuando desde donde te quedaste en el paso anterior, deberías seguir conectado al servidor MySQL y tener una transacción en progreso. Si no es así, vuelve a conectarte al servidor MySQL utilizando el siguiente comando:

mysql -u root -p

Ingresa la contraseña si se te solicita y luego selecciona la base de datos labex_db:

USE labex_db;

Si no tienes una transacción en progreso, inicia una:

BEGIN;

Ahora, insertemos un nuevo registro en la tabla accounts dentro de la transacción actual:

INSERT INTO accounts (account_number, balance) VALUES ('ACC003', 200.00);

Este comando inserta una nueva cuenta con el número de cuenta 'ACC003' y un saldo de 200.00.

Para verificar que los datos se han insertado (dentro de la transacción), ejecuta la siguiente consulta:

SELECT * FROM accounts WHERE account_number = 'ACC003';

Deberías ver el registro recién insertado. Sin embargo, como se mencionó antes, estos cambios aún no son permanentes. Solo son visibles dentro de la transacción actual.

Para hacer los cambios permanentes, necesitas COMMIT la transacción. La declaración COMMIT guarda todos los cambios realizados durante la transacción en la base de datos. Ejecuta el siguiente comando:

COMMIT;

Este comando confirma la transacción, haciendo que los datos insertados sean permanentes.

Para verificar que los cambios se han confirmado, ejecuta la misma consulta de nuevo:

SELECT * FROM accounts WHERE account_number = 'ACC003';

Deberías seguir viendo el registro recién insertado. Ahora, incluso si te desconectas del servidor MySQL y vuelves a conectarte, el registro seguirá estando allí.

También puedes verificar los cambios seleccionando todos los registros de la tabla accounts:

SELECT * FROM accounts;

Deberías ver las tres cuentas: 'ACC001', 'ACC002' y 'ACC003', con sus respectivos saldos. El saldo de 'ACC001' debería ser 900.00 (si ejecutaste la declaración de actualización en el paso anterior y no revertiste).

En resumen, este paso demostró cómo insertar datos dentro de una transacción y luego confirmar la transacción para hacer los cambios permanentes. La declaración COMMIT es crucial para garantizar que todas las operaciones dentro de una transacción se apliquen a la base de datos.

Deshacer una actualización fallida

En este paso, aprenderás cómo deshacer una transacción para revertir los cambios realizados durante la misma. Esto es especialmente útil cuando se produce un error o cuando decides que los cambios realizados dentro de la transacción no son deseables.

Continuando desde el paso anterior, deberías seguir conectado al servidor MySQL. Si no es así, vuelve a conectarte utilizando el siguiente comando:

mysql -u root -p

Ingresa la contraseña si se te solicita y luego selecciona la base de datos labex_db:

USE labex_db;

Ahora, iniciemos una nueva transacción:

BEGIN;

Simulemos una actualización fallida. Supongamos que deseas transferir 500 de 'ACC001' a 'ACC004', pero 'ACC004' no existe. Primero, intenta deducir 500 de 'ACC001':

UPDATE accounts SET balance = balance - 500 WHERE account_number = 'ACC001';

Ahora, intenta agregar 500 a 'ACC004':

UPDATE accounts SET balance = balance + 500 WHERE account_number = 'ACC004';

Es probable que esta actualización no afecte a ninguna fila porque 'ACC004' no existe. Puedes verificar esto comprobando el número de filas afectadas:

SELECT ROW_COUNT();

El resultado debe ser 0, lo que indica que no se actualizó ninguna fila.

Dado que la segunda actualización falló (o habría fallado si hubiera restricciones que impidieran la actualización), también quieres deshacer la primera actualización. Para hacer esto, puedes ROLLBACK la transacción. La declaración ROLLBACK deshace todos los cambios realizados durante la transacción, devolviendo la base de datos a su estado antes de que comenzara la transacción.

Ejecuta el siguiente comando:

ROLLBACK;

Este comando deshace la transacción, revirtiendo la deducción de 500 de 'ACC001'.

Para verificar que el deshacer se realizó correctamente, verifica el saldo de 'ACC001':

SELECT * FROM accounts WHERE account_number = 'ACC001';

El saldo de 'ACC001' debe volver a su valor original (1000 si comenzaste desde el principio, o 900 si solo confirmaste la primera actualización en el paso 1).

También puedes verificar que 'ACC003' todavía existe y tiene un saldo de 200.00 (si completaste el paso 2).

En resumen, este paso demostró cómo deshacer una transacción utilizando la declaración ROLLBACK. Esto es esencial para manejar errores y garantizar la consistencia de los datos cuando las operaciones dentro de una transacción fallan.

Utilizar un punto de guardado (savepoint) para un deshacer parcial

En este paso, aprenderás cómo utilizar puntos de guardado (savepoints) dentro de una transacción para permitir deshacer parcialmente los cambios. Los puntos de guardado son marcadores dentro de una transacción a los que se puede revertir, lo que permite deshacer solo algunos de los cambios realizados durante la transacción, en lugar de toda la transacción.

Continuando desde el paso anterior, deberías seguir conectado al servidor MySQL. Si no es así, vuelve a conectarte utilizando el siguiente comando:

mysql -u root -p

Ingresa la contraseña si se te solicita y luego selecciona la base de datos labex_db:

USE labex_db;

Ahora, iniciemos una nueva transacción:

BEGIN;

Primero, creemos un punto de guardado llamado savepoint1:

SAVEPOINT savepoint1;

Este comando crea un punto de guardado llamado savepoint1. Cualquier cambio realizado después de este punto de guardado se puede deshacer hasta este punto.

Ahora, actualicemos el saldo de 'ACC001':

UPDATE accounts SET balance = balance - 200 WHERE account_number = 'ACC001';

A continuación, creemos otro punto de guardado llamado savepoint2:

SAVEPOINT savepoint2;

Ahora, insertemos un nuevo registro en la tabla accounts:

INSERT INTO accounts (account_number, balance) VALUES ('ACC004', 300.00);

Supongamos que ahora decides que quieres deshacer la inserción de 'ACC004', pero quieres mantener la actualización de 'ACC001'. Puedes deshacer hasta savepoint2:

ROLLBACK TO savepoint2;

Este comando deshace la transacción al estado en el que se encontraba cuando se creó savepoint2, lo que efectivamente deshace la inserción de 'ACC004'.

Para verificar que el deshacer hasta savepoint2 se realizó correctamente, comprueba si 'ACC004' existe:

SELECT * FROM accounts WHERE account_number = 'ACC004';

Esta consulta no debería devolver ninguna fila, lo que indica que 'ACC004' ha sido eliminado.

Ahora, comprobemos el saldo de 'ACC001':

SELECT * FROM accounts WHERE account_number = 'ACC001';

El saldo de 'ACC001' debería estar actualizado (disminuido en 200).

Si estás satisfecho con los cambios restantes (la actualización de 'ACC001'), ahora puedes confirmar la transacción:

COMMIT;

Este comando confirma la transacción, haciendo permanente la actualización de 'ACC001'.

En resumen, este paso demostró cómo utilizar puntos de guardado dentro de una transacción para permitir deshacer parcialmente los cambios. Esto proporciona un control más detallado sobre la gestión de transacciones, lo que te permite deshacer cambios específicos mientras se mantienen otros.

Resumen

En este laboratorio (lab), aprendiste los fundamentos de las transacciones de MySQL y su importancia para mantener la integridad de los datos. El laboratorio comenzó demostrando cómo iniciar una transacción utilizando la declaración BEGIN (o START TRANSACTION). Luego, creaste una base de datos llamada labex_db y una tabla accounts dentro de ella para prepararte para las operaciones de transacción posteriores.

Los pasos iniciales se centraron en configurar el entorno y entender la sintaxis básica para iniciar una transacción, sentando las bases para explorar las operaciones COMMIT y ROLLBACK en pasos posteriores para gestionar los cambios de datos dentro de una transacción.