- InnoDB ofrece transacciones ACID, bloqueo por file i REPEATABLE READ por defecto.
- Kontrolira automatsko potvrđivanje (autocommit), pokretanje transakcije (START TRANSACTION), potvrđivanje (COMMIT/ROLLBACK) i spremanje (SAVEPOINT) za stvarno atomiziranje.
- Ajusta niveles de aislamiento y modos SAMO ČITANJE/READ WRITE sa POSTAVLJENOM TRANSAKCIJOM.
- Evita sucias, no repetibles y fantasmas equilibrando consistencia y rendimiento.

Las transacciones en MySQL son el pilar para operar con 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 practica de cómo funcionan, qué propiedades cumplen y cómo configurarlas para equilibrarconsistencia y rendimiento.
Además de cubrir comandos básicos como POKRENI TRANSAKCIJU, POTVRDI i POVRATI, verujemo u papir automatsko potvrđivanjethe nivoi atmosfere ACID, brave, tač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 unutra pohranjene procedure, así como una batería de casos prácticos para que puedas afianzar lo aprendido. Si estás preparando DAW, DAM ili ASIR, estos apuntes te van a venir como anillo al dedo.
Apuntes de BD para DAW, DAM y ASIR — Kurs 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.
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
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 system 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
- Atomičnost: el bloque se trata como indivisible; o todo OK o nada. Si una operación falla, se revierte todo el conjunto.
- Konzistentnost: 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.
- Trajnost: una vez haces
COMMIT, los cambios quedan persistidos uključujući i greške.
InnoDB vs MyISAM: motor je uvezen
U MySQL-u postoje različiti skladišni motori. Solo InnoDB podržava transakcije y claves foráneas; además ofrece bloqueo a nivel de fila y recuperación ante fallos. MyISAM no suporta transacciones 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 afecta
MySQL ima mod autocommit activado por defecto. Esto significa que, fuera de una transacción explícita, cada sentencia DML se confirma automáticamente 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 je privremeno deaktivirao i autocommit odmah 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;
Posle deaktiviraj automatsko potvrđivanje, los cambios no son permanentes hasta que ejecutes COMMITako ih želite skinuti, SAD ROLLBACK. Ten en cuenta que esta configuración es por sesión y se resetea al cerrar la conexión.
Osnovne komande: ZAPOČNITE TRANSAKCIJU, POČINITE y ROLLBACK
Tipični ciklus je: iniciar transacción, ejecutar operaciones DML i potvrditi ili deshacer según el resultado. Tienes sinónimos como BEGIN o BEGIN WORK za početak, y COMMIT/ROLLBACK za finalizaciju:
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, InnoDB garantira nepotpunu transakciju bez potvrde. Si una de las cuentas no existe o una restricción (str. ej., CHECK (bez negativnog računa) greška, transakcija se vraća y la base queda como al principio.
Savepoints: control fino dentro de la transacción
con SAVEPOINT creas puntos de recuperación dentro de una transacción para poder djelomično odstranjivanje 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;
Si definira različite SAVEPOINT sa mismo nombre, MySQL smatra krajnjim. También puedes eliminira se s RELEASE SAVEPOINT para mantener limpia la transacción.
Niveles de aislamiento: equilibrio entreconsistencia 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 šta želimo uraditi:
- 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 dozvoliti 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, generalno, 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 bloquea por defecto a nivo 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 je tražio blokove predavanja ili opisa. 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.
Načini pristupa: ČITANJE PIŠI y SAMO ČITANJE
Las transacciones pueden declararse en modo READ WRITE (zadano) ili READ ONLYU načinu samostalnog predavanja, ne dozvoljava 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 i fijarlo s SET TRANSACTION, combinándolo con el nivel de aislamiento y el ambit primjene.
POSTAVI TRANSAKCIJU: 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, U cjelini sesija ili način globalni:
-- 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 pušta da dozvoliš equilibrar fiabilidad y rendimiento según el caso de uso, desde cargas analíticas a alta concurrencia OLTP.
Primjeri istodobnosti: prljavo čitanje, bez ponavljanja i fantazma
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 adelante, 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 potvrdi i UPDATE entre dos lecturas de A. Con REPEATABLE READ lo evitas; con READ COMMITTED može se desiti.
-- 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 obala najzatvorenijih blokova.
-- 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 BRISANJE / NA AŽURIRANJE
El DML grupa ODABERI, UMETNI, AŽURIRAJ i IZBRIŠI. Al definir claves foráneas en InnoDB, puedes fijar el compportamiento ante borrados/actualizaciones en la tabla referenciada:
RESTRICT: Impide eliminar/actualizar si hay references. To je vrijednost zbog defekta u MySQL-u.CASCADE: propaga la acción a las filas hijas.SET NULL: pone el valor aNULLu djevojačkim kolicima.NO ACTIONekvivalent aRESTRICTu MySQL-u.SET DEFAULT: nije dostupno za InnoDB i MySQL.
Ova pravila su ključna za asegurar doslednost referentna y evitar datos huérfanos cuando trabajas con transacciones y relaciones complejas.
Transakcije PHP-a (mysqli): autocommit, urezivanje i vraćanje
Ako programirate u PHP-u sa mysqli, puedes controlar transacciones de forma sencila. Deaktiviraj automatsko potvrđivanje, ejecuta tus konzultacije i potvrditi ili 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 odlučuje si reintentas, notificas o tomas otra acción.
Almacenados almacenados y manejo de errores u MySQL
Almacenados almacenados MySQL je deklariran menadžeri s greškama para SQLEXCEPTION y SQLWARNING, tako da izbacuje ROLLBACK automatski 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).
- Napravi tablu
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 como
AsusoXiaomiy razona por qué puede no ser posible; ajusta claves foráneas (str. ej.,ON DELETE) ako se desi greška. - Ažuriranje koda proizvođači (
Lenovona 20,Huaweia 30) y analiza las restricciones referenciales necesarias. - Ažuriraj cijene sumando 5 € a todos los productos; elimina impresoras sa cijenom < 200 €.
Zaposleni
- Ubacite 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. - Elimina departamentos (
Proyectos,Desarrollo) y justifica si se puede o no; ajusta foráneas de ser necesario. - Ažuriranje koda (npr.
Recursos Humanosdo 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 u ured en
Almeríay un empleado representante de ventas. - Umetnite klijenta cuyo comercial sea el empleado anterior; kreiraj pedido sa manje proizvoda.
- Actualiza el código del cliente y verifica cambios en tablas relacionadas; izbriši y revisa efectos; si no 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 tablu
detalle_pedidododano poljeiva; mediante una transacción pon 18 a pedidos od januara 2009. 21 za ostale. - Dodaj campo
total_lineay rač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 u ured 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 durabilidad y atomicidad.
Comparativa rápida sa SQL Serverom i Oracleom
Koncepti su homologni: POČETAK/POKRENI TRANSAKCIJU, OBVEZI, VRAĆANJE y nivoi izolacije. En SQL Server postoji además niveles como SNAPHOTque 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? Definicije 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Šta si uradio/la
UPDATEintermedia o si la cuenta no existe? Respuesta: rollback asegura consistencia.
Dominar transacciones en MySQL es entender como se combinan ACID, autocommit, aislamiento, bloqueos, savepoints y 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 POSTAVI TRANSAKCIJU u slučaju upotrebe, izvinite procedura i kontrola grešaka, y practica con los casos propuestos: el salto de calidad en tus sistemas se nota enseguida.
