- InnoDB ofrece transacciones ACID, bloqueo por fila y REPEATABLE READ by defecto.
- Styrer autocommit, START TRANSACTION, COMMIT/ROLLBACK og SAVEPOINT for at opnå den rigtige atomicitet.
- Ajusta niveles de aislamiento y modos LÆSEKUN/LÆS SKRIV med SÆT TRANSAKTION.
- Evita sucias, ingen gentagelser y fantasmas equilibrando consistencia y rendimiento.
Transacciones en MySQL søn el pilar for operar med 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 datas a medias. En este artículo er en 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 START TRANSAKTION, COMMIT og ROLLBACK, vi tror på papiret automatisk commit, The niveauer af syre, låse, sparepunkter, adgangsmetoder y INDSTIL TRANSAKTION. También inkluderer ejemplos paso a paso de problemas de concurrencia típicos, nots sobre InnoDB vs. MyISAM, como manejar transacciones desde PHP (mysqli) og lagrede procedurer, así como una batería de casos prácticos para que puedas afianzar lo aprendido. Som forberedelse til DAW, DAM eller ASIR, er det en god ide som anillo al dedo.
Apuntes de BD for DAW, DAM og ASIR — Kursus 2025/2026. Este materiale sintetiza las mejores prácticas y la teoría clave que necesitas dominar para trabajar con transacciones en MySQL de forma professional.
note: 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
En transaktion er en enhed af arbejdslogik 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 of 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, ingen puedes permitir que la otra quede confirmada sola.
MySQL, med motoren InnoDB, implementere transaktioner og modeller ACID, proporcionando garantías sólidas de integridad incluso ante fallos de sistema o cortes de luz. Si vienes de otros SGBD, sendes som en casa: los conceptos clave son los mismos.
Propiedades SYRE: las cuatro garantías
- Atomicitet: el bloque se trata como udelelig; o gøre OK o nada. Si una operación falla, se revierte todo el conjunto.
- konsistens: cada transacción lleva la base de data de un estado válido a otro. Ingen deja reglas de negocio vulneradas ni datos imposibles.
- isolering: lo que ocurre dentro de una transacción ingen debe interferir ni vers afectado por otras que se ejecutan en paralelo, según el nivel elegido.
- holdbarhed: gør én gang
COMMIT, los cambios quedan persistidos inklusive før fald.
InnoDB vs MyISAM: import af motor
Der findes forskellige typer i MySQL opbevaringsmotorer. Solo InnoDB soporta transacciones y claves foráneas; además ofrece bloqueo a nivel de fila y recuperación ante fallos. MyISAM ingen soporta transacciones y prioriza velocidad sobre consistencia, lo que es útil para ciertos escenarios de lectura intensiva, men no es adecuado cuando necesitas SYRE.
Autocommit: qué es y cómo te afecta
MySQL har tilstanden autocommit aktiveret af defekte. Esto significa que, fuera de una transacción explícita, cada sentencia DML bekræfter automatisk como si estuviese envuelta por START TRANSACTION y COMMITHvis dommen falder, se revierté automatisk ese intento, pero si tiene éxito, no podrás deshacerla manualmente con ROLLBACK.
Cuando inicias una transacción con START TRANSACTION, MySQL er midlertidigt deaktiveret eller autocommit, når du skal 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;
Efter deaktiver autocommit, los cambios ingen søn permanentes hasta que ejecutes COMMIThvis du vil aflevere dem, USA ROLLBACK. Ten en cuenta que esta configuración es por sesión y se resetea al cerrar la conexión.
Kommandos básicos: START TRANSAKTION, FORBIND OG TILBAGE
Den typiske cyklus er: iniciar transaktioner, ejecutar operationer DML og bekræfter eller deshacer sigún el resultatet. Tienes sinónimos como BEGIN o BEGIN WORK til at starte, og COMMIT/ROLLBACK til færdiggørelse:
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 garanterer que la transacción incompleta no se confirmará. Si una de las cuentas no existe o una restricción (s. ej., CHECK (de saldo no negativ) fejl, transaktionen genindføres y la base queda como al principio.
Savepoints: kontrol fino dentro de la transacción
med SAVEPOINT creas puntos de recuperación dentro de una transacción para poder delvist afmontere uden at træne hele arbejdet:
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 definerer varios SAVEPOINT con el mismo nombre, MySQL overvejer den ultimative. También puedes eliminer dem med RELEASE SAVEPOINT para mantener limpia la transacción.
Niveles de aislamiento: equilibrio entre konsistens 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 klassiske concurrencia hvad vi vil have at købe:
- Lectura sucia (Dirty Read): leer cambios de otra transacción que aún no ha hecho
COMMIT. - Forelæsning ikke gentagelig: leer la misma fila dos veces y obtener valores distintos por bekræftede opdateringer 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 tillader de tre anomalier; READ COMMITTED Evita Lecturas Sucias pero puede sufrir ingen repetibles y fantasmas; REPEATABLE READ undgå sucias og ingen gentagelser y, generelt, indrømmer solo potenciales "fantasmaer"; 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 og nuevas conexiones, den eksisterer ikke.
Bloqueos og lectures con bloqueo
For mantener el aislamiento, el motor usa blokeringer (låsning). InnoDB bloquea por defecto a filaniveau, lo que permite borgmester concurrencia que el bloqueo por tabla. Un bloqueo impide que otras transacciones vean o alteren datas en uso mientras la tuya no haya finalizado.
Según el nivel y la operación, MySQL puede kræver bloqueos de lectura eller escritura. For eksempel SERIALIZABLE con autocommit desactivado convierte lecturas en bloqueantes para reforzar la consistentencia. El objetivo es evitar que otra transacción interfiera con tu "instantánea" de data.
Tilbehør: LÆS SKRIV og LÆS KUN
Las transacciones pueden declararse en modo READ WRITE (standard) eller READ ONLY. Forelæser alene, ingen ændringer tillades sobre tablas, udil para informere reproducerbare y estables.
-- Establecer modo de acceso al iniciar
START TRANSACTION READ ONLY;
-- o
START TRANSACTION READ WRITE;
Du kan også ødelægge det med SET TRANSACTION, combinándolo con el nivel de aislamiento y el ambit af anvendelse.
SET TRANSACTION: aislamiento, acceso y ambitos (SESSION, GLOBAL)
Dømme SET TRANSACTION permite establecer el nivel de aislamiento y el modo de acceso para la næste transaktionFor det hele session eller måde 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;
Denne kontrol tillader dig equilibrar fiabilidad y rendimiento según el caso de uso, desde cargas analíticas and alta concurrencia OLTP.
Samtidseksempler: Dirty Read, No Repetible og Fantasma
Beskidt læsning (lectura sucia): una transacción B lee valores no confirmados por A. Con READ UNCOMMITTED dette er muligt; med READ COMMITTED en adelante, nej.
-- 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
Forelæsning ikke gentagelig: B bekræfter en OPDATERING entre dos lectures af A. Con REPEATABLE READ lo evitas; con READ COMMITTED kan forekomme.
-- 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 datas, otra transacción inserta filas que encajan en el filtro. Med SERIALISERBAR undgås ved stranden af flere blokke.
-- 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: efectos ON SLET / ON UPDATE
DML-agrupen VÆLG, INDSÆT, OPDATER og SLET. Al definir claves foráneas en InnoDB, puedes fijar el comportamiento ante borrados/actualizaciones en la tabla reference:
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 aNULLi pigernes piger.NO ACTION: tilsvarende aRESTRICTi MySQL.SET DEFAULT: ikke tilgængelig med InnoDB og MySQL.
Disse regler er nøglen til asegurar consistencia referencial y evitar data huérfanos cuando trabajas con transacciones y relaciones complejas.
Transacciones desde PHP (mysqli): autocommit, commit og rollback
Hvis du programmerer PHP med MySQLi, puedes controlar transacciones de forma sencilla. Deaktiver automatisk commit, 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
}
Med dette mønster, si cualquier sentencia falla, hases rollback() og undgår uoverensstemmelser. Luego ya beslutter sig for reintentas, notificas of tomas otra acción.
Almacenados og manejo de errores i MySQL
En procedimientos almacenados de MySQL puedes declarar fejlmanøvrer para SQLEXCEPTION y SQLWARNING, så det udstøder ROLLBACK automatisk før fald:
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 når noget ikke går godt.
Casos prácticos propuestos: pon a prueba lo aprendido
Informationsbutik
- Indsæt producenter indicando código y nombre; y también solo con nombre.
- Indsæt produkter asociados a fabricantes con diferentes conjuntos de columnas (con y sin código).
- Lav en tavle
fabricante_productosmed kolonnernombre_fabricante,nombre_producto,precioe indsætte en sola vez todos los registros fratienda. - Skab udsigten
vista_fabricante_productoscon las tres columnas anteriores. - Elimina fabricanes som
AsusoXiaomiy razona por qué puede no ser posible; ajusta claves foráneas (s. ej.,ON DELETE) hvis det fejler. - Opdater koder fabrikanter (
Lenovoklokken 20,Huaweia 30) y analiza las restricciones referenciales necesarias. - Opdater priser sumando 5 € a todos los productos; eliminere trykkere med en pris < 200 €.
personale
- Indsæt afdelinger con diferentes combinaciones de columnas (con y sin código, con gastos).
- Indsæt medarbejdere vinculados a departamentos (con y sin código explícito).
- Skab og rellena
departamento_backupfradepartamento. - Eliminér afdelinger (
Proyectos,Desarrollo) y justifica si se puede o no; ajusta foráneas de ser necesario. - Opdater koder (f.eks.
Recursos Humanostil 30;Publicidada 40) evaluando impacto reference. - Forudsætninger for stigende forventninger +50.000 € solo for < 20.000 €.
- Transaktion: elimina empleados sin departamento asociado garantizando consistencia.
havearbejde
- Indsæt kontor en
Almeríay un empleado repræsentante de ventas. - Indsæt en klient cuyo kommercielt hav el empleado anterior; skabte en pedido med få produkter.
- Aktuel kundekode y verifica cambios en tablas relacionadas; slet det y revisa efectos; si ingen hø kaskader, konfigurere
ON DELETE CASCADE. - Elimina klienter uden pedidos; under 20% el precio de productos sin pedidos; Borra Pagos del cliente con menor limite de crédito.
- Justa limite de crédito a 0 til kunder med menos unidades del producto
11679. - Ændre tabellen
detalle_pedidoañadiendo campoiva; mediante una transacción pon 18 siden januar 2009 21 til resten. - tilføjer felt
total_lineay-beregning conprecio_unidad*cantidad*(1 + (iva/100))til alle registre. - Borra el cliente con menor límite de crédito: evalúa si se puede con una sola consulta y por qué.
- Indsæt kontor en
Granadamed tre kommercielle tre klienter tilknyttede; transaktion para un pedido por cliente con dos productos cada uno; bore en klient y ajusta foráneas si ingen hø cascada; transaktion til registrator pagos de esos pedidos.
Yderligere nyttige oplysninger: 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 koncepto de durabilidad y atomicidad.
Sammenligning med SQL Server og Oracle
Begreberne er homologer: START/START TRANSAKTION, COMMIT, RULBACK y isolationsniveauer. En SQL-server eksisterer som en ny dato STILLBILLEDEDet præsentere una vista consistente al begyndelse de la transacción sin bloquear tanto como SERIALISERbar. Oracle ofrece un conjunto lignende 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 SYRE? Definer det og giv et eksempel.
- ¿Cuáles søn los tres problemas de concurrencia y cómo mitigarlos con niveles de aislamiento?
- ¿Cuál es el nivel por defecto en InnoDB? GENTAGENBAR LÆSNING.
- ¿Se pueden hacer transacciones con MyISAM? Nej, det kræver InnoDB.
- Forskelle mellem InnoDB og MyISAM: transacciones, foráneas, bloqueo por fila, recuperación osv.
- Bankoverførsler: Hvad sker der, hvis du falder af
UPDATEintermedia o si la cuenta no existe? Svar: rollback asegura consistencia.
Dominar transaktioner på MySQL er ender som kombineret ACID, autocommit, aislamiento, bloqueos, savepoints og modos de acceso para proteger tus datos sin estrangular el rendimiento. Med InnoDB, tienes las herramientas para que operaciones complejas (pagos, pedidos, inventario) se comporten como una sola acción segura. Ajusta INDSTIL TRANSAKTION i tilfælde af brug, ansæt en procedurer og kontrol af fejl, y practica con los casos propuestos: el salto de calidad en tus sistemas se nota enseguida.
