- InnoDB ofrece transacciones ACID, bloqueo por fila y REPEATABLE READ por defecto.
- Kawal autocommit, MULAKAN TRANSAKSI, KOMIT/BALIK y SAVEPOINT untuk atomicidad sebenar.
- Ajusta niveles de aislamiento y modos BACA SAHAJA/BACA TULIS con SET TRANSAKSI.
- Evita sucias, tiada repetibles y fantasmas equilibrando consistencia y rendimiento.

Transaksi dalam MySQL dan pilar untuk mengendalikan data de forma segura cuando intervienen varias sentencias que deben comportarse como una sola unidad. Si algo falla por el camino, queremos volver al state anterior sin dejar la base de data 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 equilibrary consistencia y rendimiento.
Además de cubrir commandos básicos como MULAKAN TRANSAKSI, KOMIT y GULUNG SEMULA, veremos el papel de autokomit, The niveles de aislamiento ACID, kunci, titik simpanan, modos de acceso y SET TRANSAKSI. Tambien incluimos ejemplos paso a paso de problems de concurrencia típicos, notas sobre InnoDB lwn MyISAM, como manejar transacciones desde PHP (mysqli) dan dalam prosedur tersimpan, así como una batería de casos prácticos para que puedas afianzar lo aprendido. Ini adalah persediaan DAW, DAM atau ASIR, ini akan menjadi lebih baik daripada yang lain seperti sekarang ini..
Apuntes de BD para DAW, DAM y ASIR — Curso 2025/2026. Ini bahan sintetiza las mejores prácticas y la teoría clave yang memerlukan dominar untuk trabajar con transacciones en MySQL de format profesional.
Nota: El dinero donado nos sirve for mantener nuestro sitio web, así como for generar mejor content. 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
Satu transaksi es una unidad logica de trabajo que agrupa varias sentencias de forma que o se aplican todas o no se aplica ninguna. Ini adalah keadaan yang tidak konsisten, terutamanya dalam operasi komputasi untuk melihat pelbagai tab atau 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 ASID, 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
- Atomiti: el bloque se trata como tidak boleh dibahagikan; o todo OK o nada. Jika satu operación falla, se revierte todo el conjunto.
- Ketekalan: cada transacción lleva la base de data de un state válido a otro. Tiada deja reglas de negocio vulneradas ni data impossibles.
- Pengasingan: lo que ocurre dentro de una transacción no debe interferir ni ayat afectado por otras que se ejecutan en paralelo, según el nivel elegido.
- Ketahanan: una vez haces
COMMIT, los cambios quedan persistidos termasuk ante fallos.
InnoDB vs MyISAM: el motor sí importa
En MySQL wujud pelbagai enjin simpanan. Solo InnoDB menyokong transaksi y claves foráneas; además ofrece bloqueo a nivel de fila y recuperación ante fallos. MyISAM tidak menyokong transaksi y prioriza velocidad sobre consistencia, lo que es útil for ciertos escenarios de lectura intensiva, but tiada adecuado cuando memerlukan ASID.
Autokomit: qué es y cómo te affecta
MySQL tiene el modo autocommit activated 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 ini niat, tetapi jika tidak ada, tiada podrás deshacerla manualmente con ROLLBACK.
Cuando inicias una transacción con START TRANSACTION, MySQL menyahaktifkan temporalmente el autocommit hasta que haces 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;
Selepas nyahaktifkan autokomit, los cambios no son permanentes hasta que ejecutes COMMIT; si quieres descartarlos, kegunaan ROLLBACK. Sepuluh en cuenta que esta configuración es por sesión y se resetea al cerrar la conexión.
Comandos básicos: MULAKAN TRANSAKSI, KOMIT y ROLLBACK
Ciri-ciri biasa ialah: mulakan transaksi, keluarkan operaciones DML dan pengesahan o deshacer según el resultado. Tienes sinónimos como BEGIN o BEGIN WORK untuk iniciar, y COMMIT/ROLLBACK untuk 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 dengan autocommit dinyahaktifkan, InnoDB menjamin bahawa transaksi tidak lengkap tidak disahkan. Si una de las cuentas no existe or una restrictción (m.s. ej., CHECK de saldo no negativo) falla, la transacción se revierte y la base queda como al principio.
Savepoints: kawal fino dentro de la transacción
dengan 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;
Si mentakrifkan varios SAVEPOINT con el mismo 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
Keberanian por defecto en MySQL ialah REPEATABLE READ, que ofrece lecturas coherentes dentro de la misma transacción gracias al multiversioning (MVCC).
Problemas clásicos de concurrencia queremos acotar:
- Lectura sucia (Baca Kotor): leer cambios de otra transacción que aún no ha hecho
COMMIT. - Lectura tidak berulang: 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 anomalias; READ COMMITTED evita lectures sucias tetapi puede sufrir tiada repetibles y fantasmas; REPEATABLE READ evita sucias y tiada ulangan y, secara amnya, 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, tiada a las existentes.
Bloqueos y lecturas con bloqueo
Untuk menguruskan el aislamiento, el motor usa bloqueos (mengunci). 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 or alteren data en uso mientras la tuya no haya finalizado.
Según el nivel y la operación, MySQL boleh meminta bloqueos de lectura or escritura. Contohnya SERIALIZABLE con autocommit dinyahaktifkan convierte lecturas en bloqueantes for reforzar la consistencia. El objetivo es evitar que otra transacción interfiera con tu “instantánea” de data.
Modos de acceso: BACA TULIS y BACA SAHAJA
Las transacciones pueden declararse en modo READ WRITE (lalai) atau READ ONLY. En modo kuliah solo, 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 bercita-cita tinggi permohonan.
SET TRANSAKSI: aislamiento, acceso y ámbitos (SESI, GLOBAL)
Ayat SET TRANSACTION membenarkan establecer el nivel de aislamiento y el modo de acceso para la próxima transacción, Secara keseluruhan sesi atau cara 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;
Kawalan ini tidak dibenarkan equilibrar fiabilidad y rendimiento según el caso de uso, desde cargas analíticas dan alta concurrencia OLTP.
Contoh concurrencia: Bacaan Kotor, Tidak Boleh Diulang y Fantasma
Bacaan Kotor (lectura sucia): satu transaksi B lee valores tidak disahkan oleh A. Con READ UNCOMMITTED esto es possible; con READ COMMITTED en adelante, tidak.
-- 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 tidak berulang: 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: kesan ON DELETE / ON UPDATE
El DML agrupa PILIH, MASUKKAN, KEMASKINI y PADAM. Klasifikasi yang jelas untuk InnoDB, boleh didapati dalam comportamiento sebelum borrados/actualizaciones dalam rujukan tabla:
RESTRICT: impide eliminar/actualizar si hay referencias. Es el valor por defecto en MySQL.CASCADE: propaga la acción a las filas hijas.SET NULL: pone el valor aNULLen las filas hijas.NO ACTION: setara aRESTRICTdalam MySQL.SET DEFAULT: tiada boleh guna dengan InnoDB dan MySQL.
Estas reglas son clave para asegurar consistencia referencial y evitar data huérfanos cuando trabajas con transacciones y relaciones complejas.
Transacciones desde PHP (mysqli): autocommit, commit y rollback
Program dan PHP con mysqli, puedes controlar transacciones de forma sencilla. Nyahaktifkan autokomit, ejecuta tus consultas y confirma or revierte según el resultdo:
$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
}
Dengan corak ini, si cualquier sentencia falla, haces rollback() y evitas inconsistencias. Luego ya decides si reintentas, notificas or tomas otra acción.
Procedimientos almacenados and manejo de errores en MySQL
En procedimientos almacenados de MySQL boleh diisytiharkan manejadores de errores perenggan SQLEXCEPTION y SQLWARNING, jadi itu terpancut ROLLBACK secara automatik 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 types 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
- Masukkan fabricantes indicando código y nombre; y también solo con nombre.
- Masukkan produk 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 daripadatienda. - Crea la vista
vista_fabricante_productoscon las tres columnas anteriores. - Elimina fabricantes sebagai
AsusoXiaomiy razona por qué puede no ser posible; ajusta claves foráneas (hlm. ej.,ON DELETE) si hace falta. - Actualiza códigos de fabricantes (
Lenovoa 20,Huaweia 30) y analiza las retricciones referenciales necesarias. - Actualiza precios sumando 5 € a todos los productos; elimina impresoras bernilai < 200 €.
Pekerja
- Inserta departamentos con diferentes combinaciones de columnas (con y sin código, con cost).
- Inserta empleados vinculados a departamentos (con y sin código explícito).
- Crea y rellena
departamento_backupdaridepartamento. - Elimina departamentos (
Proyectos,Desarrollo) y justificasi si se puede o no; ajusta foráneas de ser necesario. - Actualiza códigos (mis.,
Recursos Humanoskepada 30;Publicidada 40) rujukan evaluando impacto. - Incremental presupuestos +50.000 € solo untuk los < 20.000 €.
- Transaksi: elimina empleados sin departamento asociado garantizando consistencia.
Berkebun
- Inserta oficina en
Almeríay un empleado wakil de ventas. - Masukkan pelanggan 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; padamkannya y menyemak semula kesan; tiada jerami jerami, mengkonfigurasi
ON DELETE CASCADE. - Elimina pelanggan pedidos dosa; 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 unitades del producto
11679. - Modifica la tabla
detalle_pedidoañadiendo campoiva; mediante una transacción pon 18 a pedidos desde enero 2009 y 21 kepada yang lain. - Tambah campo
total_lineay calcula conprecio_unidad*cantidad*(1 + (iva/100))untuk 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 comerciales y tres pelanggan asociados; transaksi para un pedido por cliente con dos productos cada uno; borra un cliente y ajusta foráneas si no hay cascada; transaksi untuk pendaftaran pagos de esos pedidos.
Ensayo tambahan útil: simula satu 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.
Perbandingan cepat dengan SQL Server dan Oracle
Los conceptos son homólogos: MULAKAN/MULAKAN TRANSAKSI, KOMITMEN, KEMBALIKAN y tahap pengasingan. Pelayan SQL wujud seperti ini GAMBAR GAMBARItu presenta una vista consistente al inicio de la transacción sin bloquear tanto como SERIALIZABLE. Oracle ofrece un conjunto de niveles serupa; en la práctica, cambia el “dialecto” tetapi 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 contoh.
- ¿Cuáles son los tres problemas de concurrencia y cómo mitigarlos con niveles de aislamiento?
- ¿Cuál es el nivel por defecto in InnoDB? BACA DIULANG.
- ¿Se pueden hacer transacciones con MyISAM? Tidak, memerlukan InnoDB.
- Perbezaan InnoDB vs MyISAM: transacciones, foráneas, bloqueo por fila, recuperación, dsb.
- Pindahan bank: ¿qué pasa si falla una
UPDATEperantara o si la cuenta tidak wujud? Jawapan: rollback asegura consistencia.
Transaksi dominan dalam MySQL adalah sebagai gabungan ACID, autocommit, aislamiento, bloqueos, savepoints y modos de acceso para proteger tus data 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 SET TRANSAKSI al caso de uso, apóyate en procedimientos y control de errores, y practica con los casos propuestos: el salto de calidad en tus sistemas se nota enseguida.
