Fundamentos de transacciones en MySQL: guía completa ACID, aislamiento y autocommit

Viimeisin päivitys: 11/05/2025
Kirjoittaja: C SourceTrail
  • InnoDB ofrece transacciones ACID, bloqueo por fila y REPEATABLE READ por defecto.
  • Hallitse automaattista vahvistusta, TRANSAKTION KÄYNNISTÄ, VAHVISTUSTA/PALAUTUSTA ja TALLENNUSPISTEITÄ todellisten atomien tuhoamiseksi.
  • Ajusta niveles de aislamiento y modos READ ONLY/READ WRITE con SET TRANSACTION.
  • Evita sucias, no repetibles y fantasmas equilibrando consistencia y rendimiento.

mysql-tapahtumat

Las transacciones en MySQL son el pilar para operar con datos de forma segura cuando intervienen varias sentencias que deben cortarse 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 ALOITA TAPAHTUMA, VAHVISTA y ROLLAUS, veren paperi automaattinen vahvistus, ACID-eristystasot, lukot, tallennuspisteitä, kulkutavat y MÄÄRITÄ TAPAHTUMA. También incluimos ejemplos paso a paso de problemas de concurrencia típicos, notas sobre InnoDB vs. MyISAM, cómo manejar transacciones desde PHP (mysqli) ja tallennetut menettelyt, 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 para DAW, DAM ja ASIR — Kurssi 2025/2026. Este materiaali sintetiza las mejores prácticas y la teoría clave que necesitas dominar para trabajar con transacciones en MySQL de forma profesional.

Huomata: 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

Yksi operaatio on yksi työelämän tekniikka 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 moottorilla 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

  • Atomuus: el bloque se trata como jakamaton; o todo OK o nada. Si una operación falla, se revierte todo el conjunto.
  • johdonmukaisuus: cada transacción lleva la base de datos de un estado válido a otro. No deja reglas de negocio vulneradas ni datos imposibles.
  • eristys: 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.
  • kestävyys: una vez haces COMMIT, los cambios quedan persistidos mukaan lukien ennen laskuja.

InnoDB vs MyISAM: moottori on tärkeä

MySQL:ssä on useita varastointi moottorit. Solo InnoDB soporta transacciones y claves foráneas; además ofrece bloqueo a nivel de fila y recuperación ante fallos. MyISAM no soporta 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 toimii tilassa Autocommit Activado por defecto. Esto significa que, fuera de una transacción explícita, cada sentencia DML se vahvista automaattinen como si estuviese envuelta por START TRANSACTION y COMMITJos tuomio oli langetettu, se palautuu automaattisesti ese intento, pero si tiene éxito, no podrás deshacerla manualmente con ROLLBACK.

Cuando inicias una transacción con START TRANSACTION, MySQL deaktivoi väliaikaisesti automaattisella toimituksella 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;

Jälkeen deaktivoi automaattinen vahvistus, los cambios no son permanentes hasta que ejecutes COMMITjos haluat kopioida, Yhdysvallat ROLLBACK. Ten en cuenta que esta configuración es por sesión y se resetea al cerrar la conexión.

Comandos Básicos: ALOITA TAPAHTUMA, SITOA ja PALAUTTA

Tyypillinen sykli on: aloita transacción, ejecutar operaciones DML ja vahvistus tai deshacer según el resultado. Tienes sinónimos como BEGIN o BEGIN WORK aloittamiseksi, y COMMIT/ROLLBACK viimeistelyyn:

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 takaa que la transacción incompleta no se Vahvista. Si una de las cuentas no existe o una restricción (s. ej., CHECK (ilman negatiivista ääntä) putoaa, la transacción se revierted y la base queda como al principio.

Tallennuspisteet: kontrolli fino dentro de la transacción

kanssa SAVEPOINT creas puntos de recuperación dentro de una transacción para poder osittainen hävittäminen ilman työtä kokonaan:

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 määrittelee eri SAVEPOINT con el mismo nombre, MySQL harkitsee el últimoa. También puedes eliminoi con 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 mitä haluan tehdä:

  • Lectura sucia (Likainen lukukokemus): leer cambios de otra transacción que aún no ha hecho COMMIT.
  • Luentoa ei voi toistaa: leer la misma fila dos veces y obtener valores distintos por vahvistettujen päivitysten de otra transacción entre ambas lecturas.
  • Lectura fantasma: ejecutar la misma consulta y que aparezcanin uudet tyypit debido a inserciones vahvistus por otra transacción.

Comportamiento por nivel (resumen práctico): READ UNCOMMITTED sallia kolme poikkeamaa; READ COMMITTED Evita lecturas sucias pero puede sufrir no repetibles y fantasmas; REPEATABLE READ Evita Sucias, ei toistoja y, en yleensä, soolo myöntää 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 ja nuevas conexiones, ei ole olemassa.

Bloqueos y lecturas con bloqueo

Para mantener el aislamiento, el motor usa bloqueot (lukitus). InnoDB bloquea por defecto a fila-taso, 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 vaatii bloqueos de lectura tai escritura. Esimerkiksi 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.

Käyttötavat: READ WRITE y READ ONLY

Las transacciones pueden declararse en modo READ WRITE (oletus) tai READ ONLYYksinopetusta muodossa, ei sallita muutoksia sobre tablas, útil para informes toistettavat y estables.

-- Establecer modo de acceso al iniciar
START TRANSACTION READ ONLY;
-- o
START TRANSACTION READ WRITE;

Myös voi olla fijarloa SET TRANSACTION, combinándolo con el nivel de aislamiento y el tavoite de aplicación.

MÄÄRITTÄ TAPASTUS: aislamiento, acceso y ámbitos (SESSION, GLOBAL)

Tuomita SET TRANSACTION permite establecer el nivel de aislamiento y el modo de acceso para la lähimmän tapahtuman, Koko istunto tai tapa maailmanlaajuinen:

-- 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;

Tämä ohjaus on lopullinen equilibrar fiabilidad y rendimiento según el caso de uso, desde cargas analíticas alta concurrencia OLTP.

Esimerkkejä concurrenciasta: Dirty Read, No Repetible y Fantasma

Likainen lukukokemus (lectura sucia): una transacción B lee valores no vahvistus por A. Con READ UNCOMMITTED se on mahdollista; kanssa READ COMMITTED adelante, ei.

-- 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

Luentoa ei voi toistaa: B vahvista ja PÄIVITYS entre dos lecturas de A. Con REPEATABLE READ lo evitas; con READ COMMITTED voi esiintyä.

-- 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 datos, otra transacción inserta filas que encajan en el filtro. SARJALLISTAVILLA se on mahdollista rannikolle enemmän 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:n olennaiset y claves foráneas: efectos ON DELETE / ON UPDATE

El DML -ryhmä VALITSE, LISÄÄ, PÄIVITÄ ja POISTA. Al definir claves foráneas en InnoDB, puedes fijar el comportamiento ante borrados/actualizaciones en la tabla referenciada:

  • RESTRICT: impide eliminar/actualizar si hay referenssit. Es el valor por defecto en MySQL.
  • CASCADE: propaga la acción a las filas hijas.
  • SET NULLpone el valor a NULL heidän siskoissaan.
  • NO ACTIONvastaava a RESTRICT MySQL:ssä.
  • SET DEFAULT: ei ole saatavilla InnoDB:ssä ja MySQL:ssä.

Nämä säännöt ovat avainasemassa asegurar johdonmukainen referenssi y evitar datos huérfanos cuando trabajas con transacciones y relaciones complejas.

Transacciones desde PHP (mysqli): automaattinen vahvistus, sitoumus ja palautus

Jos ohjelmoit PHP:llä mysqli, puedes controlar transacciones de forma sencilla. Deactiva-automaattinen vahvistus, 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
}

Tämän kuvion avulla si cualquier sentencia falla, haces rollback() y evitas inconsistencias. Luego ya päättää si reintentas, notificas o tomas otra acción.

Procedimientos almacenados y manejo de errores en MySQL

En procedimientos almacenados de MySQL puedes declarar virheenkäsittelijät ja SQLEXCEPTION y SQLWARNING, jotta siemennesteet ROLLBACK automaattisesti ennen tappiota:

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 kunhan ei ole hyvin.

Casos prácticos propuestos: pon a prueba lo aprendido

Tietojenkäsittelytiede

  • Inserts fabricantes indicando código y nombre; y también solo con nombre.
  • Inserta-tuotteet asociados a fabricantes con diferentes conjuntos de columnas (con y sin código).
  • Luo pöytä fabricante_productos pylväiden kanssa nombre_fabricante, nombre_producto, precio e inserta de una sola vez todos los registros alkaen tienda.
  • Luo näköala vista_fabricante_productos con las tres columnas anteriores.
  • Poista valmistajat kuten Asus o Xiaomi y razona por qué puede no ser posible; ajusta claves foráneas (s. ej., ON DELETE) jos se on epäonnistunut.
  • Päivitä koodit valmistajat (Lenovo klo 20, Huawei a 30) y analiza las restricciones referenciales necesarias.
  • Aktivoi hinnat sumando 5 € a todos los productos; poista kirjoittajat hintaan < 200 €.

henkilöstö

  • Lisätyt osastot con diferentes combinaciones de columnas (con y sin código, con gastos).
  • Työntekijöiden lisäykset vinculados a departamentos (con y sin código explícito).
  • Luo ja rellena departamento_backup alkaen departamento.
  • Elimina osastot (Proyectos, Desarrollo) y justifica si se puede o no; ajusta foráneas de ser necesario.
  • Päivitä koodit (esimerkiksi., Recursos Humanos 30:aan; Publicidad a 40) evaluando Impacto referenssi.
  • Lisääntyvät vaatimukset +50.000 € soolo para los < 20.000 €.
  • Kauppa: elimina empleados sin departamento asociado garantizando johdonmukaisuus.

puutarhanhoito

  • Inserta officina en Almería y un empleado representante de ventas.
  • Lisää asiakas cuyo kaupallinen meri el empleado anterior; luo pedido tuotteillani vähällä.
  • Actualisa el código del cliente y verifica cambios en tablas relacionadas; Poista se y revisa efectos; ei heinäkaskadoita, määrittää ON DELETE CASCADE.
  • Poistaa asiakkaat syntiä pedidos; alle 20 % sin pedidos tuotteet; borra pagos del cliente con menor límite de crédito.
  • Vain luottoraja a 0 para el cliente con menos unidades del producto 11679.
  • Muokkaa taulukkoa detalle_pedido añadiendo campen iva; mediante una transacción pon 18 jalkoja tammikuussa 2009 21 muille.
  • lisää kenttä total_linea y laske con precio_unidad*cantidad*(1 + (iva/100)) kaikille rekistereille.
  • Borra el client con menor límite de crédito: evalúa si se puede con una sola consulta y por qué.
  • Inserta officina en Granada kolmen kaupallisen kanssa y kolme asiakasta kumppanit; liiketoimi para un pedido for asiakas con dos cada uno; ottaa asiakas y ajusta foráneas si no hay cascada; liiketoimi para registrar pagos de esos pedidos.

Lisäetu: 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.

Vertaa SQL Serveriä ja Oraclea

Käsitteet ovat homologisia: ALOITA/ALOITA TAPAHTUMA, COMMIT, palautus y eristystasot. SQL Server on olemassa además niveles como PIKAKUVAEttä presenta una vista johdonmukainen al inicio de la transacción sin bloquear tanto como SERIALIZABLE. Oracle ofrece un conjunto samanlaisia ​​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? Määrittele ja käytä esimerkkiä.
  • ¿Cuáles son los tres problems de concurrencia y cómo mitigarlos con niveles de aislamiento?
  • ¿Cuál es el nivel por defecto en InnoDB? TOISTETTAVA LUKU.
  • Näetkö pueden hacer transacciones kanssa MyISAM? Ei, InnoDB:tä ei tarvita.
  • InnoDB:n ja MyISAMin väliset erot: transacciones, foráneas, bloqueo por fila, recuperación jne.
  • Pankkisiirrot¿qué pasa si falla una UPDATE intermedia o si la cuenta ei ole olemassa? Vastaus: rollback asegura consistencia.

Dominar transacciones en MySQL on yhdistetty 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 MÄÄRITÄ TAPAHTUMA käyttötarkoituksen tapauksessa hyväksyä prosedimientos y control de errores, y practica con los casos propuestos: el salto de calidad en tus sistemas se nota enseguida.

visión general de sistemas de almacenamiento de datos
Aiheeseen liittyvä artikkeli:
Visión general de sistemas de almacenamiento de datos
Related viestiä: