- InnoDB ofrece transacciones ACID, bloqueo por fila y REPEATABLE READ por defecto.
- Kontrolin ang autocommit, START TRANSACTION, COMMIT/ROLLBACK y SAVEPOINT para sa atomicidad real.
- Ajusta niveles de aislamiento y modos READ ONLY/READ WRITE con SET TRANSACTION.
- Evita sucias, walang repetibles y fantasmas equilibrando consistencia y rendimiento.

Las transacciones en MySQL son el pilar para operar con data de forma segura cuando intervienen varias sentencias que deben comportarse como una sola unidad. Si algo falla por el camino, queremos volver al estado anterior sin dejar la base de datos a medias. En este artículo vas a encontrar una explicación completa y práctica de cómo funcionan, qué propiedades cumplen y cómo configurarlas para equilibrar consistencia y rendimiento.
Además de cubrir commandos básicos como MAGSIMULA NG TRANSACTION, COMMIT y ROLLBACK, veremos el papel de autocommit, Ang niveles de aislamiento ACID, mga kandado, savepoints, modos de acceso y Itakda ang TRANSAKSIYON. También incluimos ejemplos paso a paso de problemas de concurrencia típicos, notas sobre InnoDB kumpara sa MyISAM, cómo manejar transacciones desde PHP (mysqli) at sa mga nakaimbak na pamamaraan, así como una batería de casos prácticos para que puedas afianzar lo aprendido. Si estás preparando DAW, DAM o ASIR, estos apuntes te van a venir como anillo al dedo.
Apuntes de BD para DAW, DAM y ASIR — Curso 2025/2026. Este material sintetiza las mejores prácticas y la teoría clave que necesitas dominar para trabajar con transacciones en MySQL de form na propesyonal.
Nota: El dinero donado nos sirve para mantener nuestro sitio web, así como para generar mejor contenido. Tu apoyo nos ayuda a seguir creando guías técnicas útiles y al día.
Qué es una transacción y por qué importa
Una transacción es una unidad logica de trabajo que agrupa varias sentencias de forma que o se aplican todas o no se aplica ninguna. Esto evita estados inconsistentes, especialmente en operaciones compuestas que tocan varias tablas o filas. Piensa en un traspaso entre cuentas bancarias: se descuenta de la cuenta origen y se abona en la destino; si una de las acciones falla, no puedes permitir que la otra quede confirmada sola.
MySQL, con el motor InnoDB, implementa transacciones según el modelo ACID, proporcionando garantías sólidas de integridad incluso ante fallos de sistema o cortes de luz. Si vienes de otros SGBD, te sentirás como en casa: los conceptos clave son los mismos.
Propiedades ACID: las cuatro garantías
- Atomicity: el bloque se trata como indivisible; o todo OK o nada. Si una operación falla, se revierte todo el conjunto.
- Pagkakaugnay: cada transacción lleva la base de datos de un estado válido a otro. Walang deja reglas de negocio vulneradas ni mga datos na imposible.
- Pag-iisa: lo que ocurre dentro de una transacción no debe interferir ni verse affectado por otras que se ejecutan en paralelo, según el nivel elegido.
- Katatagan: una vez haces
COMMIT, los cambios quedan persistidos kasama ang ante fallos.
InnoDB vs MyISAM: ang motor ay importa
Mayroong iba't ibang MySQL mga imbakan engine. Ang Solo InnoDB ay sumusuporta sa mga transacciones at claves foráneas; además ofrece bloqueo a nivel de fila y recuperación ante fallos. Ang MyISAM ay walang suportang transakciones y prioriza velocidad sobre consistencia, lo que es útil para ciertos escenarios de lectura intensiva, pero no es adecuado cuando necesitas ACID.
Autocommit: qué es y cómo te affecta
Ang MySQL ay naaayon sa modo autocommit activado por defecto. Esto significa que, fuera de una transacción explícita, cada sentencia DML se confirma automaticamente como si estuviese envuelta por START TRANSACTION y COMMIT. Si la sentencia falla, se revierte automaticamente ese intento, pero si tiene éxito, no podrás deshacerla manualmente con ROLLBACK.
Cuando inicias una transacción con START TRANSACTION, Ang MySQL ay nag-deactivate ng temporalmente el autocommit hasta que hasta COMMIT o ROLLBACK. Puedes cambiar el autocommit a nivel de sesión con SET:
-- Ver el valor actual
SELECT @@autocommit;
-- Desactivar autocommit en la sesión actual
SET autocommit = 0;
-- Activarlo de nuevo
SET autocommit = 1;
Pagkatapos i-deactivate ang autocommit, los cambios no son permanentes hasta que ejecutes COMMIT; si quieres descartarlos, Estados Unidos ROLLBACK. Ten en cuenta que esta configuración es por sesión y se resetea al cerrar la conexión.
Comandos básicos: START TRANSACTION, COMMIT y ROLLBACK
Ang karaniwang tipikal ay: iniciar transacción, ejecutar operaciones DML y confirmar o deshacer según el resultado. Tienes sinónimos como BEGIN o BEGIN WORK para iniciar, y COMMIT/ROLLBACK para finalizar:
START TRANSACTION;
UPDATE cuentas SET saldo = saldo - 100 WHERE id = 20;
UPDATE cuentas SET saldo = saldo + 100 WHERE id = 30;
COMMIT; -- o ROLLBACK si algo fue mal
Si el sistema cae entre las dos UPDATE o se pierde la conexión con autocommit desactivado, Garantiza ang InnoDB na hindi kumpleto ang transaksyon na nakumpirma. Si una de las cuentas no existe o una restrictción (p. ej., CHECK de saldo no negativo) falla, la transacción se revierte y la base queda como al principio.
Savepoints: kontrolin ang fino dentro de la transacción
may SAVEPOINT creas puntos de recuperación dentro de una transacción para poder deshacer parcialmente sin tirar todo el trabajo:
START TRANSACTION;
UPDATE productos SET stock = stock - 2 WHERE id = 10;
SAVEPOINT p1;
UPDATE productos SET stock = stock - 5 WHERE id = 11;
-- Si falla lo siguiente, solo deshacemos hasta p1
ROLLBACK TO SAVEPOINT p1;
-- Seguimos con otras operaciones
RELEASE SAVEPOINT p1;
COMMIT;
Tinutukoy ng Si ang varios SAVEPOINT con el mismong nombre, MySQL considera el último. También puedes eliminarlos con RELEASE SAVEPOINT para mantener limpia la transacción.
Niveles de aislamiento: equilibrio entre consistencia y rendimiento
Ang lakas ng loob por defecto sa MySQL ay REPEATABLE READ, que ofrece lecturas coherentes dentro de la misma transacción gracias al multiversioning (MVCC).
Problema clásicos de concurrencia queremos acotar:
- Lectura sucia (Dirty Read): leer cambios de otra transacción que aún no ha hecho
COMMIT. - Lectura na hindi nauulit: leer la misma fila dos veces y obtener valores distintos por actualizaciones confirmadas de otra transacción entre ambas lecturas.
- Lectura fantasma: ejecutar la misma consulta y que aparezcan filas nuevas debido a inserciones confirmadas por otra transacción.
Comportamiento por nivel (resumen práctico): READ UNCOMMITTED permite las tres anomalías; READ COMMITTED evita lecturas sucias pero puede sufrir no repetibles y fantasmas; REPEATABLE READ evita sucias y walang repetibles y, sa pangkalahatan, solo admite potenciales "fantasmas"; SERIALIZABLE bloquea como si ejecutaras en serie, eliminando las tres a costa de más bloqueos.
-- Consultar nivel de aislamiento (sesión y global)
SELECT @@transaction_isolation; -- sesión
SELECT @@global.transaction_isolation; -- global
Puedes ajustar el aislamiento por transacción, sesión o globalmente. Recuerda que los cambios GLOBAL afectan a nuevas conexiones, walang a las existentes.
Bloqueos y lecturas con bloqueo
Para mantener el aislamiento, el motor usa bloqueos (pagsasara). InnoDB bloquea por defecto a nivel de fila, lo que permite mayor concurrencia que el bloqueo por tabla. Un bloqueo impide que otras transacciones vean o alteren data en uso mientras la tuya no haya finalizado.
Según el nivel y la operación, MySQL puede requerir bloqueos de lectura o escritura. Halimbawa, SERIALIZABLE con autocommit desactivado convierte lecturas en bloqueantes para reforzar la consistencia. El objetivo es evitar que otra transacción interfiera con tu “instantánea” de datos.
Modos de acceso: READ WRITE y READ ONLY
Las transacciones pueden declararse en modo READ WRITE (default) o READ ONLY. En modo solo lecture, no se permiten cambios sobre tablas, útil para informes reproducibles y estables.
-- Establecer modo de acceso al iniciar
START TRANSACTION READ ONLY;
-- o
START TRANSACTION READ WRITE;
También puedes fijarlo con SET TRANSACTION, combinándolo con el nivel de aislamiento y el ambit ng aplikasyon.
SET TRANSACTION: aislamiento, acceso y ámbitos (SESSION, GLOBAL)
Pangungusap SET TRANSACTION permite establecer el nivel de aislamiento y el modo de acceso para sa próxima transacción, Para sa kabuuhan session o paraan global:
-- Aplica a la próxima transacción (si no indicas ámbito)
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ, READ ONLY;
-- Aplica a todas las transacciones de esta sesión actual
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ WRITE;
-- Aplica a sesiones futuras (no a las existentes)
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
Ito ay kontrolin ang iyong pinahihintulutan equilibrar fiabilidad y rendimiento según el caso de uso, desde cargas analíticas at alta concurrencia OLTP.
Ejemplos de concurrencia: Dirty Read, No Repetible y Fantasma
Dirty Read (lectura sucia): una transacción B lee valores no confirmados por A. Con READ UNCOMMITTED ito ay posible; con READ COMMITTED sa adelante, hindi.
-- Terminal A
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
START TRANSACTION;
UPDATE cuentas SET saldo = saldo - 100 WHERE id = 1;
-- (sin COMMIT todavía)
-- Terminal B
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT saldo FROM cuentas WHERE id = 1; -- puede ver el saldo "sucio"
-- Terminal A
ROLLBACK; -- los cambios se deshacen
Lectura na hindi nauulit: B confirma un UPDATE entre dos lecturas de A. Con REPEATABLE READ lo evitas; con READ COMMITTED puede ocurrir.
-- Terminal A
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION;
SELECT saldo FROM cuentas WHERE id = 1; -- lectura 1
-- Terminal B (otra sesión)
UPDATE cuentas SET saldo = saldo - 100 WHERE id = 1;
COMMIT;
-- Terminal A
SELECT saldo FROM cuentas WHERE id = 1; -- lectura 2 (puede diferir)
ROLLBACK;
Lectura fantasma: entre dos consultas que agregan data, otra transacción inserta filas que encajan en el filtro. Con SERIALIZABLE se evita a costa de más bloqueos.
-- Terminal A
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
SELECT SUM(saldo) FROM cuentas;
-- Terminal B
INSERT INTO cuentas(id, saldo) VALUES (4, 3000);
COMMIT;
-- Terminal A
SELECT SUM(saldo) FROM cuentas; -- puede observar un "fantasma"
ROLLBACK;
DML esencial y claves foráneas: epekto ON DELETE / ON UPDATE
El DML grupo SELECT, INSERT, UPDATE y DELETE. Al definir claves foráneas en InnoDB, puedes fijar el comportamiento ante borrados/actualizaciones en la tabla referenciada:
RESTRICT: impide eliminar/actualizar si hay referencias. Ito ay lakas ng loob para sa defecto sa MySQL.CASCADE: propaga la acción a las filas hijas.SET NULL: pone el valor aNULLen las filas hijas.NO ACTION: katumbas aRESTRICTsa MySQL.SET DEFAULT: walang magagamit sa InnoDB sa MySQL.
Estas reglas son clave para asegurar consistencia referencial y evitar datos huérfanos cuando trabajas con transacciones y relaciones complejas.
Transacciones desde PHP (mysqli): autocommit, commit y rollback
Ang mga programa sa PHP con mysqli, puedes controlar transacciones de forma sencilla. I-deactivate ang autocommit, ejecuta tus consultas y confirma o revierte según el resultado:
$db = new mysqli("localhost", "root", "pass", "database");
$db->autocommit(false);
try {
$db->query("INSERT INTO users (name) VALUES ('marcus')");
$db->query("UPDATE users SET name = 'jane' WHERE id = 39");
$db->commit();
} catch (Throwable $e) {
$db->rollback();
// log del error
}
Gamit ang pattern na ito, si cualquier sentencia falla, haces rollback() y evitas inconsistencias. Luego ya decides si reintentas, notificas o tomas otra acción.
Mga pamamaraan ng almacenados at manejo de error sa MySQL
Sa pamamaraan ng mga almacenados ng MySQL ay maaaring ipahayag manejadores de errores para SQLEXCEPTION y SQLWARNING, kaya na nagpapalabas ROLLBACK awtomatiko ante fallos:
DELIMITER //
CREATE PROCEDURE transferir(IN p_origen INT, IN p_destino INT, IN p_importe DECIMAL(10,2))
BEGIN
DECLARE exit handler FOR SQLEXCEPTION
BEGIN
ROLLBACK;
END;
START TRANSACTION;
UPDATE cuentas SET saldo = saldo - p_importe WHERE id = p_origen;
UPDATE cuentas SET saldo = saldo + p_importe WHERE id = p_destino;
COMMIT;
END //
DELIMITER ;
También puedes usar un único manejador común para diferentes tipos de error si te encaja mejor. El objetivo es centralizar la reversión y dejar la base limpia cuando algo no va bien.
Casos prácticos propuestos: pon a prueba lo aprendido
Tienda de informática
- Ipasok ang mga fabricantes indicando código y nombre; y también solo con nombre.
- Ipasok ang mga produkto asociados a fabricantes con diferentes conjuntos de columnas (con y sin código).
- Crea la tabla
fabricante_productoscon columnasnombre_fabricante,nombre_producto,precioe inserta de una sola vez todos los registros mula satienda. - Crea la vista
vista_fabricante_productoscon las tres columnas anteriores. - Elimina fabricantes bilang
AsusoXiaomiy razona por qué puede no ser posible; ajusta claves foráneas (p. ej.,ON DELETE) si hace falta. - Actualiza códigos de fabricantes (
Lenovoisang 20,Huaweia 30) y analiza las retricciones referenciales necesarias. - Actualiza precios sumando 5 € a todos los productos; elimina impresos may halaga < 200 €.
Mga empleyado
- Inserta departamentos con diferentes combinaciones de columnas (con y sin código, con gastos).
- Inserta empleados vinculados a departamentos (con y sin código explícito).
- Crea y rellena
departamento_backupmula sadepartamento. - Elimina departamentos (
Proyectos,Desarrollo) y justifica si se puede o no; ajusta foráneas de ser necesario. - Actualiza códigos (hal.
Recursos Humanoshanggang 30;Publicidadisang 40) evaluando impacto referencial. - Incremental presupuestos +50.000 € solo para sa los < 20.000 €.
- Transaksyon: elimina empleados sin departamento asociado garantizando consistencia.
Paghahardin
- Inserta oficina en
Almeríay un empleado representante de ventas. - Ipasok ang kliyente cuyo comercial sea el empleado anterior; crea un pedido con al menos dos productos.
- Actualiza el código del cliente y verifica cambios en tablas relacionadas; tanggalin ito y revisa effects; wala akong hay cascadas, i-configure
ON DELETE CASCADE. - Alisin ang mga kliyente kasalanan pedidos; sube un 20% el precio de productos sin pedidos; borra pagos del cliente con menor límite de crédito.
- Ajusta límite de crédito a 0 para el cliente con menos unidades del producto
11679. - Modifica la tabla
detalle_pedidoañadiendo campoiva; mediante una transacción pon 18 a pedidos desde enero 2009 y 21 sa iba pa. - Idagdag field
total_lineay calcula conprecio_unidad*cantidad*(1 + (iva/100))para todos los registros. - Borra el cliente con menor límite de crédito: evalúa si se puede con una sola consulta y por qué.
- Inserta oficina en
Granadacon tres commerciales y tatlong kliyente asociados; transaksyon para un pedido por cliente con dos productos cada uno; borra un cliente y ajusta foráneas si no hay cascada; transaksyon para sa registrar pagos de esos pedidos.
Ensayo addicional útil: simula una pérdida de conexión con SET AUTOCOMMIT = 0, cierra la sesión antes de finalizar y luego reconecta para comprobar qué quedó persistido y qué no. Esto teaterriza el concepto de durability y atomicidad.
Comparativa rápida sa SQL Server at Oracle
Los conceptos son homólogos: SIMULA/SIMULA ANG TRANSAKSIYON, Magsanay, BUMALIK y mga antas ng paghihiwalay. Sa SQL Server ay umiiral ang mga niveles tulad ng SNAPSHOTNa presenta una vista consistente al inicio de la transacción sin bloquear tanto como SERIALIZABLE. Oracle ofrece un conjunto similar de niveles; en la práctica, cambia el “dialecto” pero la música es la misma: se busca el punto óptimo entre aislamiento y rendimiento.
Preguntas típicas de examen/entrevista
- ¿Qué son las propiedades ACID? Defínelas y pon un ejemplo.
- ¿Cuáles son los tres problemas de concurrencia y cómo mitigarlos con niveles de aislamiento?
- ¿Cuál es el nivel por defecto en InnoDB? PAULIT-ULIT NA BASAHIN.
- ¿Se pueden hacer transacciones con MyISAM? Hindi, kailangan ng InnoDB.
- Mga pagkakaiba ng InnoDB kumpara sa MyISAM: transacciones, foráneas, bloqueo por fila, recuperación, atbp.
- Paglilipat ng bangko: ¿qué pasa si falla una
UPDATEintermedia o si la cuenta no existe? Sagot: rollback asegura consistencia.
Dominar transacciones en MySQL ay entender cómo se combinan ACID, autocommit, aislamiento, bloqueos, savepoints at modos de acceso para proteger tus datos sin estrangular el rendimiento. Con InnoDB, tienes las herramientas para que operaciones complejas (pagos, pedidos, inventario) se comporten como una sola acción segura. Ajusta Itakda ang TRANSAKSIYON al caso de uso, apóyate en mga pamamaraan at pagkontrol ng mga pagkakamali, y practica con los casos propuestos: el salto de calidad en tus sistemas se nota enseguida.
