- InnoDB je prejel transakcije ACID, blokiral datoteko REPEATABLE READ zaradi napake.
- Nadzorujte samodejno potrditev, ZAŽENI TRANSAKCIJO, POTRDI/POVRNI in TOČKO SHRANJANJA za dejansko atomizacijo.
- Ajusta 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 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 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 ZAČNI TRANSAKCIJO, POTRDI in VRNI NAZAJ, verjamemo v papir samodejno potrjevanje, ravni ožiganja ACID, ključavnice, shranjevalne točke, načini dostopa y NASTAVITE TRANSAKCIJO. También incluimos ejemplos paso a paso de problemas de concurrencia típicos, notas sobre InnoDB proti MyISAM, cómo manejar transacciones desde PHP (mysqli) in shranjeni postopki, así como una batería de casos prácticos para que puedas afianzar lo aprendido. Si estás preparando DAW, DAM ali ASIR, estos apuntes te van a venir como anillo al dedo.
Apuntes de BD za DAW, DAM in 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.
opomba: 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 ena enota logike dela 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 z motorjem InnoDB, implementa transacciones según el modelo KISLINA, 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
- Atomičnost: el bloque se trata como nedeljivo; o todo OK o nada. Če una operación falla, se revierte todo el conjunto.
- Doslednost: 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: ena vez haces
COMMIT, los cambios quedan persistidos vključno z napakami.
InnoDB proti MyISAM: uvozni motor
V MySQL obstaja več različnih shranjevalni stroji. Solo InnoDB podpira transakcije in klave za druge; además ofrece bloqueo a nivel de fila y recuperación ante fallos. MyISAM ne podpira transakcij y prioriza velocidad sobre consistencia, lo que es útil para ciertos escenarios de lectura intensiva, pero no es adecuado cuando necesitas ACID.
Samodejna zaveza: qué es y cómo te afecta
MySQL ima način autocommit activado por defecto. Esto significa que, fuera de una transacción explícita, cada sentencia DML se confirma avtáticamente como si estuviese envuelta por START TRANSACTION y COMMITČe je stavek napačen, se samodejno vrne ese intento, pero si tiene éxito, no podrás deshacerla manualmente con ROLLBACK.
Cuando inicias una transacción con START TRANSACTION, MySQL začasno onemogoči samodejno potrditev, ki je hitra 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;
Po deaktiviraj samodejno potrditev, los cambios no son permanentes hasta que ejecutes COMMITče jih želite prenesti, ZDA ROLLBACK. Ten en cuenta que esta configuración es por sesión y se resetea al cerrar la conexión.
Osnovne ukaze: ZAČNI TRANSAKCIJO, ZAVEZI in POVRNI
Tipični cikel je: iniciar transacción, ejecutar operaciones DML y confirmar o deshacer según el resultado. Tienes sinónimos como BEGIN o BEGIN WORK za začetek, y COMMIT/ROLLBACK za zaključek:
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 jamči, da nepopolna transakcija ni potrjena. Si una de las cuentas no existe o una restrictción (p. ej., CHECK (brez negativnega pričakovanja) napaka, transakcija se spet pojavi y la base queda como al principio.
Shranjevalne točke: nadzor fino dentro de la transacción
z SAVEPOINT creas puntos de recuperación dentro de una transacción para poder delno odmrznjeno brez tirara vsega dela:
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čne SAVEPOINT con el mismo nombre, MySQL razmislite o zadnjem. También puedes izločiti z RELEASE SAVEPOINT para mantener limpia la transacción.
Niveles de aislamiento: equilibrio entre consistencia y rendimiento
El 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 kaj želimo storiti:
- Lectura sucia (Umazano branje): leer cambios de otra transacción que aún no ha hecho
COMMIT. - Predavanje se ne da ponoviti: leer la misma fila dos veces y obtener valores distintos por potrjene posodobitve de otra transacción entre ambas lecturas.
- Predavanje fantazije: 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 dovoli tri anomalije; READ COMMITTED evita predavanja sucias pero puede sufrir no repetibles y fantasmas; REPEATABLE READ evita sucias in nič ponovitev y, en general, 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, teh ne obstaja.
Bloqueos y lecturas con bloqueo
Para mantener el aislamiento, el motor usa bloki (zaklepanje). InnoDB blokira napako a raven fileja, 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 lahko zahteva bloke predavanj ali zapisov. Na primer, 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 (privzeto) oz READ ONLYV načinu samostojnega predavanja, spremembe se ne dovolijo sobre tablas, útil para informes reproducibles y estables.
-- Establecer modo de acceso al iniciar
START TRANSACTION READ ONLY;
-- o
START TRANSACTION READ WRITE;
Lahko se tudi naroči z SET TRANSACTION, combinándolo con el nivel de aislamiento y el velikost uporabe.
NASTAVI TRANSAKCIJO: aislamiento, acceso y ámbitos (SESIJA, GLOBALNO)
Stavek SET TRANSACTION permite establecer el nivel de aislamiento y el modo de acceso para la naslednja transakcija, V celoti sejo ali način globalna:
-- 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;
Ta nadzor te končno dovoli equilibrar fiabilidad y rendimiento según el caso de uso, desde cargas analíticas in alta concurrencia OLTP.
Ejemplos de concurrencia: Dirty Read, No Repetitable y Fantasma
Umazano branje (lectura sucia): una transacción B lee valores no confirmados por A. Con READ UNCOMMITTED to je mogoče; z READ COMMITTED v adelante, št.
-- 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 da ponoviti: B confirma un UPDATE entre dos lecturas de A. Con REPEATABLE READ lo evitas; con READ COMMITTED se lahko zgodi.
-- 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;
Predavanje fantazije: entre dos consultas que agregan datos, otra transacción inserta filas que encajan en el filtro. Z možnostjo SERIALIZABILNOSTI se izognemo obalo najzaključnejših.
-- 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: učinki ON DELETE / ON UPDATE
Skupina El DML IZBERI, VSTAVI, POSODOBI in IZBRIŠI. Al definir claves foráneas en InnoDB, puedes fijar el comportamiento ante borrados/actualizaciones en la tabla referenciada:
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 aNULLv dojenčicah.NO ACTION: ekvivalent aRESTRICTv MySQL-u.SET DEFAULT: ni na voljo z InnoDB in MySQL.
Ta pravila so ključna za asegurar consistencia referencial y evitar datos huérfanos cuando trabajas con transacciones y relaciones complejas.
Transacciones desde PHP (mysqli): autocommit, commit y rollback
Si programs en PHP con mysqli, puedes controlar transacciones de forma sencilla. Deaktiviraj samodejno potrditev, 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 tem vzorcem, si cualquier sentencia falla, haces rollback() in izognemo nedoslednostim. Luego ya decids si reintentas, notificas o tomas otra acción.
Procedimientos almacenados y manejo de errores en MySQL
En procedimientos almacenados de MySQL puedes declarar upravljavci z napakami za SQLEXCEPTION y SQLWARNING, tako da izvrže ROLLBACK samodejno pred padci:
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 ko nekaj ni v redu.
Casos prácticos propuestos: pon a prueba lo aprendido
Informacijska trgovina
- Vstavki proizvajalcev indicando código y nombre; y también solo con nombre.
- Vstavljeni izdelki asociados a fabricantes con diferentes conjuntos de columnas (con y sin código).
- Ustvari tablo
fabricante_productoss stebrinombre_fabricante,nombre_producto,precioe inserta de una sola vez todos los registros iztienda. - Ustvari razgled
vista_fabricante_productoscon las tres columnas anteriores. - Odstranite proizvajalce kot
AsusoXiaomiy razona por qué puede no ser posible; ajusta claves foráneas (p. ej.,ON DELETE) če si naredil napako. - Posodobi kode izdelovalci (
Lenovo20,Huaweia 30) y analiza las restrictciones referenciales necesarias. - Posodobi cene sumando 5 € a todos los productos; odstranitev tiskarjev s ceno < 200 €.
Zaposleni
- Vstavite oddelke con diferentes combinaciones de columnas (con y sin código, con gastos).
- Vstavljeno vinculados a departamentos (con y sin código explícito).
- Ustvari in izpolni
departamento_backupoddepartamento. - Odstranite oddelke (
Proyectos,Desarrollo) y justifica si se puede o no; ajusta foráneas de ser necesario. - Posodobi kode (npr.
Recursos Humanosna 30;Publicidada 40) evaluando impacto referencial. - Povečanje predpostavk +50.000 € solo para los < 20.000 €.
- Transakcija: elimina empleados sin departamento asociado garantizando consistencia.
Vrtnarjenje
- Vstavite uradno en
Almeríay un empleado representante de ventas. - Vstavi stranko cuyo komercialno morje el empleado anterior; ustvari pedido z manj izdelki.
- Actualiza el código del cliente y verifica cambios en tablas relacionadas; Zbriši y revisa efectos; si no hay cascadas, konfiguracijo
ON DELETE CASCADE. - Elimina stranke brez stopal; pod 20 % el precio de productos sin pedidos; borra pagos del cliente con menor límite de crédito.
- Prilagoditev omejitve kredita a 0 para el cliente con menos unidades del producto
11679. - Spremeni tablo
detalle_pedidopolje za dodajanjeiva; mediante una transacción pon 18 pedidos od januarja 2009 21 ostalim. - Dodaj polje
total_lineay izračun zprecio_unidad*cantidad*(1 + (iva/100))za vse registre. - Borra el cliente con menor límite de crédito: evalúa si se puede con una sola consulta y por qué.
- Vstavite uradno en
Granadas tremi komercialnimi podjetji in tri stranke združenja; transakcije para un pedido por cliente con dos productos cada uno; plačati stranko y ajusta foráneas si no hay cascada; transakcije para registrar pagos de esos pedidos.
Dodatno koristno: 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.
Hitra primerjava s strežnikom SQL in Oracle
Koncepti so homologni: ZAČNI/ZAČNI TRANSAKCIJO, OBVEZNO, POVRAT y ravni izolacije. En SQL Server obstaja kot en niveles como PREGLEDTo presenta una vista consistente al inicio de la transacción sin bloquear tanto como SERIALIZABLE. Oracle ofrece un conjunto similar de niveles; en la practica, 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 piedades ACID? Definiram in na primer.
- ¿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 BRANJE.
- ¿Se pueden hacer transacciones con MyISAM? Ne, potreben je InnoDB.
- Razlike med InnoDB in MyISAM: transacciones, foráneas, bloqueo por fila, recuperación itd.
- Bančni nakazili¿qué pasa si falla una
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 estrangelar el rendimiento. Z InnoDB, tienes las herramientas para que operaciones complejas (pagos, pedidos, inventario) se comporten como una sola acción segura. Ajusta NASTAVITE TRANSAKCIJO v primeru uporabe, oprostite procedimientos y control de errores, y practica con los casos propuestos: el salto de calidad en tus sistemas se nota enseguida.
