Βασικές αρχές συναλλαγών στο MySQL: πλήρης ACID, aislamiento y autocommit

Τελευταία ενημέρωση: 11/05/2025
Συγγραφέας: C SourceTrail
  • Το InnoDB παρέχει συναλλαγές ACID, μπλοκ από αρχεία και REPEATABLE READ ή ελαττωματικά.
  • Έλεγχος αυτόματης ολοκλήρωσης, έναρξης συναλλαγής, επιβεβαίωσης/επαναφοράς και σημείου αποθήκευσης για πραγματική ατομικότητα.
  • Ajusta niveles de aislamiento y modos ΜΟΝΟ ΔΙΑΒΑΣΗ/ΔΙΑΒΑΣΗ ΕΓΓΡΑΦΗ με ΣΕΤ ΣΥΝΑΛΛΑΓΗΣ.
  • Evita sucias, no repetibles y fantasmas equilibrando consencia y rendimiento.

συναλλαγές mysql

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. Εν προκειμένω, μια ενιαία επεξήγηση ολοκλήρωσης και πρακτικής άσκησης του συνόλου των λειτουργιών, που προορίζονται για τη ρύθμιση παραμέτρων για την ισορροπία της συνέπειας και της προσαρμογής.

Además de cubrir comandos básicos como ΕΝΑΡΞΗ ΣΥΝΑΛΛΑΓΗΣ, ΔΕΣΜΕΥΣΗ και ΑΝΑΚΥΡΩΣΗ, veremos το χαρτί του αυτόματη καταχώρηση, Η επίπεδα ισλαμισμού 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 o ASIR, estos apuntes te van a venir como anillo al dedo.

Apuntes de BD para DAW, DAM y 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 profesionale.

σημείωση: 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, υλοποίηση συναλλαγών σε ένα μοντέλο ΟΞΥ, 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 αδιαίρετο; 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. Δεν υπάρχουν αδύναμα δεδομένα για το διαπραγματεύσιμο.
  • Μόνωση: 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: ο κινητήρας είναι σημαντικός

Υπάρχουν διάφορα σε MySQL κινητήρες αποθήκευσης. Solo InnoDB προσφέρει συναλλαγές και claves foráneas; además ofrece bloqueo a nivel de fila y recuperación ante fallos. Το MyISAM δεν παρέχει συναλλαγές y prioriza velocidad sobre consencia, 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 έχει τη λειτουργία αυτόματη δέσμευση 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 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.

Comandos básicos: ΕΝΑΡΞΗ ΣΥΝΑΛΛΑΓΗΣ, ΔΕΣΜΕΥΣΗ και ΕΠΑΝΤΡΟΦΗ

Το τυπικό κυκλάκι είναι: iniciar transacción, ejecutar operaciones DML y επιβεβαίωση ή αποσαθρωτική 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 restrición (σελ. ej., CHECK του σάλντο όχι αρνητικό) λάθος, η συναλλαγή που ανακτήθηκε y la base queda como al principio.

Σημεία αποθήκευσης: έλεγχος fino dentro de la transacción

με 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 ορίζει τα varios SAVEPOINT con el mismo nombre, Η MySQL εξετάζει το τέλος. Ταμπιέν πουέντ εξάλειψη RELEASE SAVEPOINT para mantener limpia la transacción.

Niveles de aislamiento: Equilibrio entre consencia 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).

Προβλήματα 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.

Compportamiento por nivel (resumen práctico): READ UNCOMMITTED επιτρέπονται οι τρεις ανωμαλίες; READ COMMITTED Εβίτα Λέκτουρας Σούσιας pero puede sufrir no repetibles y fantasmas? REPEATABLE READ Εβίτα Σούσιας και όχι επαναλήψεις y, γενικά, 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 ΠΑΓΚΟΣΜΙΑ σε μια νέα σύνταξη, όχι στα υπάρχοντα.

Bloqueos y lecturas con bloqueo

Para mantener el aislamiento, el motor usa μπλοκέος (κλείδωμα). InnoDB bloquea por defecto α επίπεδο γένους, lo que permite mayor 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 requerir bloqueos de lectura o escritura. Για παράδειγμα, SERIALIZABLE con autocommit desactivado convierte lecturas en bloqueantes para reforzar la consencia. El objetivo es evitar que otra transacción interfiera contu "instantánea" detos.

Τρόπος πρόσβασης: READ WRITE y READ ONLY

Las transacciones pueden declaarse 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 (SESSION, GLOBAL)

Πρόταση 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;

Αυτός ο έλεγχος είναι άκυρος ισορροπία fiabilidad y rendimiento según el caso de uso, desde cargas analíticas a alta concurrencia OLTP.

Ejemplos de concurrencia: Dirty Read, No Repetible y Fantasma

Βρώμικη Ανάγνωση (lecture sucia): 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 επιβεβαίωση και 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. Με δυνατότητα SERIALIZABLE (σειριοποίησης) στην ακτή των περισσότερων μπλοκαρισμάτων.

-- 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 ΣΤΗ ΔΙΑΓΡΑΦΗ / ΚΑΤΑ ΤΗΝ ΕΝΗΜΕΡΩΣΗ

Ομάδα El DML ΕΠΙΛΟΓΗ, ΕΙΣΑΓΩΓΗ, ΕΝΗΜΕΡΩΣΗ και ΔΙΑΓΡΑΦΗ. 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. Es el Valor Por Defecto στο MySQL.
  • CASCADE: propaga la acción a las filas hijas.
  • SET NULL: pone el valor a NULL στις κοπέλες μου.
  • NO ACTION: ισοδύναμο με ένα RESTRICT στην MySQL.
  • SET DEFAULT: δεν είναι διαθέσιμο στο InnoDB στο MySQL.

Αυτός ο κανονισμός είναι κλειδωμένος για asegurar consistencia παραπομπή y evitar datos huérfanos cuando trabajas con transacciones y relataciones complejas.

Transacciones desde PHP (mysqli): autocommit, commit y rollback

Εάν έχετε προγράμματα σε PHP με mysqli, puedes controlar transacciones de forma secilla. Αυτόματη καταχώρηση απενεργοποίησης, ejecuta tus consultas y επιβεβαίωση ή αναθεώρηση según el αποτέλεσμα:

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

Procedimientos almacenados y manejo de errores en MySQL

Διακηρύσσεται η διαδικασία της αλμακένωσης της MySQL χειριστές σφαλμάτων για 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, precio e inserta de una sola vez todos los registros από tienda.
  • Δημιουργήστε τη θέα vista_fabricante_productos con las tres columnas anteriores.
  • Καταργήστε τα κατασκευαστικά προϊόντα ως Asus o Xiaomi y razona por qué puede no ser posible; ajusta claves foráneas (σελ. ej., ON DELETE) σι χάτσε φάλτα.
  • Ενημερωμένοι κώδικες κατασκευαστές (Lenovo ένα 20, Huawei a 30) y analiza las restriciones referenciales necesarias.
  • Τιμές ενημέρωσης sumando 5 € a todos los productos; elimina impresoras με τιμή < 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; Publicidad α 40) αναφορική εκτίμηση επιρροής.
  • Αύξηση των προϋποθέσεων +50.000 € solo para los < 20.000 €.
  • Συναλλαγή: elimina empleados sin departamento asociado garantizando consencia.

Κηπουρική

  • Ένθετο οφικίνα en Almería y un empleado presentante de ventas.
  • Εισαγωγή πελάτη cuyo comercial sea el empleado anterior? δημιουργώ ένα πέος με τα λιγότερα προϊόντα.
  • Πραγματοποιήστε τον κώδικα του πελάτη y verifica cambios en tablas relacionadas; διαγράψτε το y revisa efectos; σιγά δεν υπάρχουν καταρράκτες σανού, σετ 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_linea υπολογισμός y με 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; συναλλαγή παρα ληξιαρχος παγος δε εως πεδιδος.

Επιπλέον χρήση: 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

Οι έννοιες είναι ομόλογες: ΕΝΑΡΞΗ/ΕΝΑΡΞΗ ΣΥΝΑΛΛΑΓΗΣ, ΔΙΑΠΡΑΤΤΩ, ΕΠΑΝΑΦΟΡΑ y επίπεδα απομόνωσης. Στον SQL Server υπάρχει ένα επίπεδο επιπέδου ΣΤΙΓΜΙΟΤΥΠΟΌτι παρουσίαση μιας όψης συνεπούς αρχής της συναλλαγής sin bloquear tanto como ΣΕΙΡΑΙΩΣΙΜΟ. Oracle ofrece un conjunto παρόμοια 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.

Προτιμήσεις για εξετάσεις/εντρέβιστα

  • ¿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; ΕΠΑΝΑΛΗΨΙΜΗ ΑΝΑΓΝΩΣΗ.
  • ¿Προσπαθείτε να κάνετε συναλλαγές με το MyISAM; Όχι, απαιτείται InnoDB.
  • Διαφορές μεταξύ InnoDB και MyISAM: transacciones, foráneas, bloqueo por fila, recuperación κ.λπ.
  • Τραπεζικές μεταφορές: ¿que pasa si falla una UPDATE intermedia o si la cuenta δεν υπάρχει; Απάντηση: rollback asegura consencia.

Οι συναλλαγές Dominar en MySQL είναι συνδυαζόμενες 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. Ατζούστα ΡΥΘΜΙΣΗ ΣΥΝΑΛΛΑΓΗΣ σε περίπτωση χρήσης, αποχωρώ Procedimientos y έλεγχος σφαλμάτων, 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
σχετικό άρθρο:
Visión general de sistemas de almacenamiento de datos
Σχετικές αναρτήσεις: