- InnoDB ofrece Transacciones ACID, blocked por file y REPEATABLE READ por defecto.
- Kontrolira automatsko potvrđivanje (autocommit), pokretanje transakcije (START TRANSACTION), potvrđivanje (COMMIT/ROLLBACK) i spremanje (SAVEPOINT) za stvarno atomiziranje.
- Adjusta niveles de aislamiento y modos READ ONLY/READ WRITE con SET TRANSACTION.
- Evita sucias, no repetibles y fantasmas equilibrando consistencia y rendimiento.

Las transacciones en MySQL son el pilar para operar with datos 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 comandos básicos como POKRENI TRANSAKCIJU, POTVRDI i POVRATI, vjerujemo papiru automatsko potvrđivanje, razine ispušnih plinova ACID, brave, točke spremanja, načini pristupa y POSTAVI TRANSAKCIJU. También incluimos ejemplos paso a paso de problemas de concurrencia típicos, notas sobre InnoDB u odnosu na MyISAM, cómo manejar transacciones desde PHP (mysqli) i pohranjene procedure, 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 za DAW, DAM i ASIR — Tečaj 2025./2026. Este material sintetiza las mejores prácticas y la teoría clave que necesitas dominar para trabajar con transacciones en MySQL de forma profesional.
Primijetiti: 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
Jedna transakcija je jedna jedinica logike rada 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 s motorom 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
- Valentnost: el bloque se trata como indivisible; o todo OK o nada. Ako una operación falla, revierte todo el conjunto.
- dosljednost: cada transacción lleva la base de datos de un estado válido a otro. No deja reglas de negocio vulneradas ni datos imposibles.
- Izolacija: lo que ocurre dentro de una transacción no debe interferir ni verse afectado por otras que se ejecutan en paralelo, según el nivel elegido.
- Izdržljivost: una vez haces
COMMIT, los cambios quedan persistidos uključujući i prije grešaka.
InnoDB protiv MyISAM-a: uvozni motor
U MySQL-u postoje razni skladišni motori. Solo InnoDB podržava transakcije i članke za korisnike; además ofrece bloqueo a nivel de fila y recuperación ante fallos. MyISAM ne podržava transakcije y prioriza velocidad sobre consistencia, lo que es útil para ciertos escenarios de lectura intensiva, pero no es adecuado cuando necesitas KISELINA.
Autocommit: qué es y cómo te afecta
MySQL ima način rada autocommit activado por defecto. Esto significa que, fuera de una transacción explícita, cada sentencia DML se confirma automatski como si estuviese envuelta por START TRANSACTION y COMMITAko je rečenica pogrešna, automatski se vraća ese intento, pero si tiene éxito, no podrás deshacerla manualmente con ROLLBACK.
Cuando inicias una transacción con START TRANSACTION, MySQL privremeno deaktivira autocommit brzo 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;
Nakon deaktiviraj automatsko potvrđivanje, los cambios no son permanentes hasta que ejecutes COMMITako ih želite skinuti, namjene ROLLBACK. Ten en cuenta que esta configuración es por sesión y se resetea al cerrar la conexión.
Osnovne naredbe: POKRENI TRANSAKCIJU, OBVEZI i POVRATAK
Tipični ciklus je: iniciar transacción, ejecutar operaciones DML y confirmar o deshacer según el resultado. Tienes sinónimos como BEGIN o BEGIN WORK za početak, y COMMIT/ROLLBACK za finaliziranje:
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 sistem cae entre las dos UPDATE o se pierde la conexión con autocommit desactivado, InnoDB jamči da transakcija nije dovršena nije potvrđena. Si una de las cuentas no existe o una restrictción (str. ej., CHECK (nema negativnog računa) transakcija se vraća y la base queda como al principio.
Točke spremanja: kontrola fino dentro de la transacción
s SAVEPOINT creas puntos de recuperación dentro de una transacción para poder djelomično odmašiti bez prestanka cijelog posla:
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;
Definira različite SAVEPOINT con el mismo nombre, MySQL smatra posljednjim. También puedes eliminira s RELEASE SAVEPOINT para mantener limpia la transacción.
Niveles de aislamiento: equilibrio entre consistencia y rendimiento
Valor por defecto en MySQL es REPEATABLE READ, que ofrece lecturas coherentes dentro de la misma transacción gracias al multiversioning (MVCC).
Problemas clásicos de concurrencia što želimo učiniti:
- Lectura sucia (Prljavo štivo): leer cambios de otra transacción que aún no ha hecho
COMMIT. - Predavanje se ne može ponoviti: leer la misma fila dos veces y obtener valores distintos por potvrđene ažuriranja de otra transacción entre ambas lecturas.
- Fantastično čitanje: 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 dopuštam tri anomalije; READ COMMITTED evita lecturas sucias pero puede sufrir no repetibles y fantasmas; REPEATABLE READ evita sucias i ništa se ne može ponoviti y, en general, solo admite potencijales “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, ne postoje.
Bloqueos y lecturas con bloqueo
Para mantener el aislamiento, el motor usa blokovi (zaključavanje). InnoDB blok zbog greške a razina fila, lo que permite mayor concurrencia que el bloqueo por tabla. Un bloqueo impide que otras transacciones vean o alteren datos en uso mientras la tuya no haya finalizado.
Según el nivel y la operación, MySQL može zahtijevati blokove predavanja ili zapisa, Na primjer, 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: ČITAJ PIŠI y SAMO ČITAJ
Las transacciones pueden declararse en modo READ WRITE (zadano) ili READ ONLYU načinu samostalnog predavanja, ne dopušta promjene sobre tablas, útil para informes reproducibles y estables.
-- Establecer modo de acceso al iniciar
START TRANSACTION READ ONLY;
-- o
START TRANSACTION READ WRITE;
Također se može složiti s SET TRANSACTION, combinándolo con el nivel de aislamiento y el granica primjene.
SET TRANSAKCIJA: aislamiento, acceso y ámbitos (SESIJA, GLOBALNO)
Rečenica SET TRANSACTION permite establecer el nivel de aislamiento y el modo de acceso para la sljedeća transakcija, Za cijelo sjednica ili način globalno:
-- 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;
Ova kontrola te konačno dopušta equilibrar fiabilidad y rendimiento según el caso de uso, desde cargas analíticas a alta concurrencia OLTP.
Ejemplos de concurrencia: Dirty Read, No Repetitable y Fantasma
Prljavo štivo (lectura sucia): una transacción B lee valores no confirmados por A. Con READ UNCOMMITTED ovo je moguće; s READ COMMITTED u adelanteu, br.
-- 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
Predavanje se ne može ponoviti: B confirma un UPDATE entre dos lecturas de A. Con REPEATABLE READ lo evitas; con READ COMMITTED može se dogoditi.
-- 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;
Fantastično čitanje: entre dos consultas que agregan datos, otra transacción inserta filas que encajan en el filtro. Sa SERIALIZABILJNIM se izbjegne obalu najzatvorenijih.
-- 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: efekti NA DELETE / ON UPDATE
El DML grupa ODABERI, UMETNI, AŽURIRAJ i IZBRIŠI. Al definir claves foráneas en InnoDB, puedes fijar el comportamiento ante borrados/actualizaciones en la tabla referenceciada:
RESTRICT: impide eliminar/actualizar si hay references. Es el valor por defecto en MySQL.CASCADE: propaga la acción a las filas hijas.SET NULL: pone el valor aNULLu donjem dijelu tijela.NO ACTIONekvivalent aRESTRICTu MySQL-u.SET DEFAULT: nije dostupno s InnoDB i MySQL.
Ova pravila su ključna za asegurar consistencia referentni y evitar datos huérfanos cuando trabajas con transacciones y relaciones complejas.
Transakcije PHP-a (mysqli): autocommit, commit y rollback
Ako programirate u PHP-u s mysqli, puedes controlar transacciones de forma sencila. Deaktiviraj automatsko potvrđivanje, 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
}
S ovim uzorkom, si cualquier sentencia falla, haces rollback() i nedosljednosti koje se izbjegavaju. Luego ya decis si reintentas, notificas o tomas otra acción.
Procedimientos almacenados y manejo de errores en MySQL
En procedimientos almacenados of MySQL puedes declarar menadžeri s pogreškama za SQLEXCEPTION y SQLWARNING, tako da izbacuje ROLLBACK automatsko prije grešaka:
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 kad nešto nije u redu.
Casos prácticos propuestos: pon a prueba lo aprendido
Informatička trgovina
- Umetci proizvođača indicando código y nombre; y también solo con nombre.
- Umetnuti proizvodi asociados a fabricantes con diferentes conjuntos de columnas (con y sin código).
- Stvori ploču
fabricante_productossa stupovimanombre_fabricante,nombre_producto,precioe inserta de una sola vez todos los registros odtienda. - Stvori pogled
vista_fabricante_productoscon las tres columnas anteriores. - Elimina fabricantes kao
AsusoXiaomiy razona por qué puede no ser posible; ajusta claves foráneas (str. ej.,ON DELETE) ako se dogodi pogreška. - Ažuriranje koda proizvođači (
Lenovoi 20,Huaweia 30) y analiza las restrictciones referenciales necesarias. - Ažuriraj cijene sumando 5 € a todos los productos; elimina impresoras s cijenom < 200 €.
Osoblje
- Umetnite odjele con diferentes combinaciones de columnas (con y sin código, con gastos).
- Umetnuto vinculados a departamentos (con y sin código explícito).
- Stvori i ispuni
departamento_backupoddepartamento. - Uklonite odjele (
Proyectos,Desarrollo) y justifica si se puede o no; ajusta foráneas de ser necesario. - Ažuriranje koda (npr.
Recursos Humanosna 30;Publicidada 40) evaluando impacto referencial. - Incrementa pretpostavke +50.000 € solo para los < 20.000 €.
- Transakcija: elimina empleados sin departamento asociado garantizando consistencia.
vrtlarstvo
- Umetnite službeni dokument en
Almeríay un empleado representante de ventas. - Umetnite klijenta cuyo komercijalno more el empleado anterior; stvoriti pedido s manje proizvoda.
- Actualiza el código del cliente y verifica cambios en tablas relacionadas; Obriši y revisa efectos; nema hay cascadas, konfigurirati
ON DELETE CASCADE. - Elimina klijenti bez stopala; ispod 20% el precio de productos sin pedidos; borra pagos del cliente con menor límite de crédito.
- Prilagodite ograničenje kredita a 0 para el cliente con menos unidades del producto
11679. - Izmijeni ploču
detalle_pedidododan tereniva; mediante una transacción pon 18 a pedidos od siječnja 2009. 21 ostalim. - Dodaje polje
total_lineay izračun sprecio_unidad*cantidad*(1 + (iva/100))za sve registre. - Borra el cliente con menor límite de crédito: evalúa si se puede con una sola consulta y por qué.
- Umetnite službeni dokument en
Granadas tri komercijalne nekretnine i tres clientes udruženja; transakcija para un pedido por cliente con dos productos cada uno; donio klijenta y ajusta foráneas si no hay cascada; transakcija para registrar pagos de esos pedidos.
Dodatno korisno: 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 te aterriza el concepto de rabilidad y atomicidad.
Brza usporedba sa SQL Serverom i Oracleom
Koncepti su homologni: POČETAK/POKRENI TRANSAKCIJU, POČINITI, VRAĆANJE y razine izolacije. SQL Server postoji na svim razinama SNIMAKDa 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? Definiramo i na primjer.
- ¿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? PONOVLJIVO ČITANJE.
- ¿Se pueden hacer transacciones con MyISAM? Ne, potreban je InnoDB.
- Razlike između InnoDB-a i MyISAM-a: transacciones, foráneas, bloqueo por fila, recuperación, itd.
- Bankovni transferiŠto si učinio/la ako si promašio/la
UPDATEintermedia o si la cuenta no existe? Respuesta: rollback asegura consistencia.
Dominar transacciones en MySQL es entender cómo se combinan ACID, autocommit, aislamiento, bloqueos, savepoints y modos de acceso para proteger tus datos sin estrangular el rendimiento. Uz InnoDB, tienes las herramientas para que operaciones complejas (pagos, pedidos, inventario) se comporten como una sola acción segura. Ajusta POSTAVI TRANSAKCIJU u slučaju upotrebe, izvinite procedimientos y control de errores, y practica con los casos propuestos: el salto de calidad en tus sistemas se nota enseguida.
