- InnoDB за получаване на ACID транзакции, блокиране на файл с REPEATABLE READ поради дефект.
- Контролирайте autocommit, START TRANSACTION, COMMIT/ROLLBACK и SAVEPOINT за реално атомизиране.
- Adjusta niveles de aislamiento y modos READ ONLY/READ WRITE con SET TRANSACTION.
- Evita sucias, no repetibles y fantasmas equilibrando consistencia y rendimiento.

Транзакциите в MySQL са големи за опериране с данни на защитената форма 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 СТАРТ НА ТРАНСАКЦИЯТА, ИЗПЪЛНЕНИЕ И ВРЪЩАНЕще ви дам хартията автоматично потвърждаване, The нива на ислямия ACID, брави, точки за запазване, начини за достъп y ЗАДАВАНЕ НА ТРАНЗАКЦИЯ. También incluimos ejemplos paso a paso de problemas de concurrencia típicos, notas sobre InnoDB срещу MyISAM, cómo manejar transacciones desde PHP (mysqli) и съхранени процедури, así como una batería de casos prácticos para que puedas afianzar lo aprendido. Si estás preparando DAW, DAM или ASIR, estos apuntes te van a venir como anillo al dedo.
Apuntes de BD за DAW, DAM и ASIR — Курс 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.
Внимание: 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
Една транзакция е една логическо единство на работата 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, с мотор 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
- атомност: el bloque se trata como indivisible; o todo OK o nada. Si una operación falla, se revierte todo el conjunto.
- съгласуваност: cada transacción lleva la base de datos de un estado válido a otro. No deja reglas de negocio vulneradas ni datos imposibles.
- изолация: 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.
- трайност: една връзка прави
COMMIT, los cambios quedan persistidos включително преди грешки.
InnoDB срещу MyISAM: el motor sí importa
В MySQL съществуват различни двигатели за съхранение. Solo InnoDB поддържа транзакции и раздели за foráneas; además ofrece bloqueo a nivel de fila y recuperación ante fallos. MyISAM не поддържа транзакции 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 има режим autocommit activado por defecto. Esto significa que, fuera de una transacción explícita, cada sentencia DML се потвърждава автоматично como si estuviese envuelta por START TRANSACTION y COMMITАко изречението е грешно, връща се автоматично ese intento, pero si tiene éxito, no podrás deshacerla manualmente con ROLLBACK.
Cuando inicias una transacción con START TRANSACTION, MySQL дезактивира временно автоматично подаване на бърза грешка 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;
След деактивиране на автоматичното потвърждаване, los cambios no son permanentes hasta que ejecutes COMMITако искате да ги изтеглите, САЩ ROLLBACK. Ten en cuenta que esta configuración es por sesión y se resetea al cerrar la conexión.
Основни команди: СТАРТ НА ТРАНЗАКЦИЯ, АНГАЖИРАНЕ и ВЪЗСТАНОВЯВАНЕ
Типичният цикъл е: инициарна транзакция, изхвърляне на DML операции и потвърждение или премахване según el resultado. Tienes sinónimos como BEGIN o BEGIN WORK за да започна, y COMMIT/ROLLBACK за финализиране:
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 гарантира, че незавършената транзакция не е потвърдена. Si una de las cuentas no existe o una restrictción (стр. ej., CHECK (грешка от негативната оценка), сделката се потвърждава y la base queda como al principio.
Точки за запазване: контролирайте fino dentro de la transacción
Con SAVEPOINT creas puntos de recuperación dentro de una transacción para poder частично отстраняване без да търпя цялата работа:
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 дефинира различни SAVEPOINT con el mismo nombre, MySQL счита за последен. También puedes елиминира с 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 какво искаме да направим:
- Мръсно четиво (Lectura sucia): leer cambios de otra transacción que aún no ha hecho
COMMIT. - Неповторима лекция: leer la misma fila dos veces y obtener valores distintos por потвърдени актуализации de otra transacción entre ambas lecturas.
- Лекция фантазия: ejecutar la misma consulta y que апарезкан филас нуевас debido a inserciones confirmadas por otra transacción.
Comportamiento por nivel (resumen práctico): READ UNCOMMITTED позволявам трите аномалии; READ COMMITTED Евита лекции Сусиас pero puede sufrir no repetibles y fantasmas; REPEATABLE READ Евита Сусиас и без повторения 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, няма такива.
Bloqueos y lecturas con bloqueo
Para mantener el aislamiento, el motor usa блокове (заключване). InnoDB блокира дефекта a ниво на фила, 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 може да изисква блокове от лекции или текстове, Например, 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.
Режими на достъп: ЧЕТЕНЕ, ПИСАНЕ и САМО ЧЕТЕНЕ
Las transacciones pueden declararse en modo READ WRITE (по подразбиране) или READ ONLYВ режим на самостоятелна лекция, не се позволяват промени sobre tablas, útil para informes reproducibles y estables.
-- Establecer modo de acceso al iniciar
START TRANSACTION READ ONLY;
-- o
START TRANSACTION READ WRITE;
Може да се сложи и с SET TRANSACTION, combinándolo con el nivel de aislamiento y el амбит на приложение.
ЗАДАВАНЕ НА ТРАНЗАКЦИЯ: aislamiento, acceso y ámbitos (СЕСИЯ, ГЛОБАЛНО)
Изречение SET TRANSACTION permite establecer el nivel de aislamiento y el modo de acceso para la следваща транзакция, За цялото сесия или начин в световен мащаб:
-- 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;
Този контрол те е разрешил equilibrar fiabilidad y rendimiento según el caso de uso, от аналитични превозни средства и друга конкуренция OLTP.
Eemplos de concurrencia: Dirty Read, No Repetible y Fantasma
Мръсно четиво (мръсна четене): una transacción B lee valores no confirmados por A. Con READ UNCOMMITTED това е възможно; с READ COMMITTED в аделанте, не.
-- 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
Неповторима лекция: B потвърди un UPDATE entre dos lecturas de A. Con REPEATABLE READ ло евитас; с READ COMMITTED може да се случи.
-- 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;
Лекция фантазия: entre dos consultas que agregan datos, otra transacción inserta filas que encajan en el filtro. Със СЕРИАЛИЗИРУЕМА СЕ ИЗМЪКВА крайбрежието на най-много блокове.
-- 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: ефекти ПРИ ИЗТРИВАНЕ / ПРИ АКТУАЛИЗИРАНЕ
Ел ДМЛ агрупа ИЗБЕРИ, ВМЪКНИ, АКТУАЛИЗИРАЙ и ИЗТРИЙ. Al definir claves foráneas en InnoDB, puedes fijar el comportamiento ante borrados/actualizaciones en la tabla referenciada:
RESTRICT: impide eliminar/actualizar si hay referencias. Е el valor por defecto en MySQL.CASCADE: propaga la acción a las filas hijas.SET NULL: поне ел валор аNULLв домашните си дрехи.NO ACTIONеквивалент на aRESTRICTв MySQL.SET DEFAULT: не е наличен с InnoDB в MySQL.
Тези правила са ключови за asegurar consistencia referencial y evitar datos huérfanos cuando trabajas con transacciones y relaciones complejas.
Транзакции от PHP (mysqli): автоматично извършване, извършване и връщане назад
Ако програмираш на PHP с MySQLi, puedes controlar transacciones de forma sencila. Деактивиране на автоматичното потвърждаване, 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
}
С този модел, si cualquier sentencia falla, haces rollback() и избягва несъответствия. Luego ya реши si reintentas, notificas o tomas otra acción.
Almacenados procedimientos y manejo de errores en MySQL
En procedimientos almacenados de MySQL puedes declarar маниаци за грешки за SQLEXCEPTION y SQLWARNING, така че изхвърля ROLLBACK автоматично преди грешки:
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 когато нещо не е добре.
Casos prácticos propuestos: pon a prueba lo aprendido
Информационен магазин
- Вложки от производители indicando código y nombre; y también solo con nombre.
- Вложете продукти asociados a fabricantes con diferentes conjuntos de columnas (con y sin código).
- Създай табла
fabricante_productosс колониnombre_fabricante,nombre_producto,precioe inserta de una sola vez todos los registros отtienda. - Създай гледка
vista_fabricante_productoscon las tres columnas anteriores. - Премахване на производителите като
AsusoXiaomiy razona por qué puede no ser posible; ajusta claves foráneas (p. ej.,ON DELETE) ако се случи, няма да е наред. - Актуализиране на кодове производители (
Lenovo20,Huaweia 30) y анализ на необходимите референтни ограничения. - Актуализирайте цените сума 5 € за всички продукти; елимина импресорас с цена < 200 €.
персонал
- Вмъкване на отдели con diferentes combinaciones de columnas (con y sin código, con gastos).
- Вмъкнати vinculados a departamentos (con y sin código explícito).
- Създадено и създано
departamento_backupотdepartamento. - Премахване на отдели (
Proyectos,Desarrollo) y justifica si se puede o no; ajusta foráneas de ser necesario. - Актуализиране на кодове (Например,
Recursos Humanosдо 30;Publicidada 40) evaluando impacto referencial. - Повишаване на предпоставките +50 000 € самостоятелно за < 20 000 €.
- Транзакция: elimina empleados sin departamento asociado garantizando consistencia.
градинарство
- Вложка за офицена en
Almeríay un empleado representante de ventas. - Вмъкване на клиент cuyocomercial sea el empleado anterior; създай педито с най-малко продукти.
- Actualiza el código del cliente y verifica cambios en tablas relacionadas; Изтрий го y revisa efectos; si no hay cascadas, конфигурация
ON DELETE CASCADE. - Елиминиране на клиенти без стъпала; под 20% el precio de productos sin pedidos; Бора Пагос del cliente con menor límite de crédito.
- Приспособяване на кредитния лимит a 0 para el cliente con menos unidades del producto
11679. - Промяна на таблото
detalle_pedidoполе за добавянеiva; mediante una transacción pon 18 подготвени от януари 2009 г. 21 към останалите. - добавя Кампо
total_lineay смятане сprecio_unidad*cantidad*(1 + (iva/100))за всички регистри. - Бора ел клиенте con menor límite de crédito: evalúa si se puede con una sola consulta y por qué.
- Вложка за офицена en
Granadaс три търговски обекта и трима клиенти асоциирани; транзакция para un pedido por cliente con dos productos cada uno; боря един клиент y ajusta foráneas si no hay cascada; транзакция para registrar pagos de esos pedidos.
Допълнително полезно: 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.
Сравнително бързо с SQL Server и Oracle
Концепциите са сходни: ЗАПОЧВАНЕ/СТАРТ НА ТРАНЗАКЦИЯТА, COMMIT, ВРЪЩАНЕ y нива на изолация. En SQL Server съществува като además niveles como МОМЕНТАЛНА СНИМКАЧе 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 propiedades ACID? Определено и дайте пример.
- ¿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? ПОВТОРНО ЧЕТЕНЕ.
- ¿Se pueden hacer transacciones con MyISAM? Не, необходим е InnoDB.
- Разлики между InnoDB и MyISAM: transacciones, foráneas, bloqueo por fila, recuperación и др.
- Банкови преводикакво правиш, ако си го направил/а
UPDATEintermedia o si la cuenta no existe? Отговор: връщане назад като последователност.
Dominar transacciones en MySQL es entender cómo se combinan ACID, autocommit, aislamiento, bloqueos, savepoints и modos de acceso para proteger tus datos sin estrangular el rendimiento. С InnoDB, tienes las herramientas para que operaciones complejas (pagos, pedidos, inventario) se comporten como una sola acción segura. Аюста ЗАДАВАНЕ НА ТРАНЗАКЦИЯ в случай на употреба, извинете procedimientos y control de errores, y practica con los casos propuestos: el salto de calidad en tus sistemas se nota enseguida.
