ความรู้พื้นฐานเกี่ยวกับธุรกรรมใน MySQL: guía completa ACID, aislamiento และ autocommit

การปรับปรุงครั้งล่าสุด: 11/05/2025
  • InnoDB มี transacciones ACID, bloqueo por fila และ REPEATABLE READ por Defo
  • Controla autocommit, START TRANSACTION, COMMIT/ROLLBACK และ SAVEPOINT para atomicidad real.
  • Ajusta niveles de aislamiento y modos อ่านอย่างเดียว/อ่านเขียนพร้อมธุรกรรมชุด
  • Evita sucias ไม่มีการทำซ้ำ และแฟนตาซีที่เท่าเทียมและสม่ำเสมอ

ธุรกรรม mysql

Las transacciones ใน MySQL ทำหน้าที่จัดการข้อมูลตามรูปแบบ cuando intervienen varias sentencias que deben compportarse 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 allowanceencia y rendimiento.

Además de cubrir comandos básicos como เริ่มธุรกรรม ยืนยันและย้อนกลับ, veremos el papel de การยืนยันอัตโนมัติ, niveles de aislamiento ACID, ล็อค, จุดเซฟ, modos de acceso y ตั้งค่าธุรกรรม- También incluimos ejemplos paso a paso de problemsas de concurrencia típicos, notas sobre InnoDB เทียบกับ MyISAM, ร่วมด้วย manejar transacciones desde PHP (mysqli) และ กระบวนการจัดเก็บ, así como una batería de casos prácticos para que puedas afianzar lo aprendido. เรากำลังเตรียมการ DAW, DAM หรือ ASIR, estos apuntes te van a venir como anillo al dedo.

ขยายออกไปสำหรับ DAW, DAM และ ASIR — หลักสูตร 2025/2026. วัสดุ Este sintetiza las mejores prácticas y la teoría clave ความต้องการที่เหนือกว่าสำหรับการแลกเปลี่ยนและ MySQL ในรูปแบบมืออาชีพ

หมายเหตุ: 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

Una transacción es una unidad lógica de trabajo que agrupa varias sentencias de forma que หรือ se aplica todas หรือ 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, ไม่มี puedes allowanceir que la otra quede ยืนยันโซลา.

MySQL, con el motor InnoDB, ดำเนินการ transacciones según el modelo กรด, proporcionando garantías sólidas de integridad รวม ante fallos de sistema หรือ cortes de luz. Si vienes de otros SGBD, te sentirás como en casa: los conceptos clave ลูกชาย los mismos.

กรดโพรพีดาเดส: las cuatro garantías

  • ปรมาณู: el bloque se trata como แบ่งแยกไม่ได้; o สิ่งที่ต้องทำ ตกลง โอ นาดา 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. ไม่มี deja reglas de negocio vulneradas ni datos ที่เป็นไปไม่ได้.
  • ฉนวนกันความร้อน: แท้จริงแล้วเกิดขึ้น dentro de una transacción ไม่มี debe interferir ni verse afectado por otras que se ejecutan en paralelo, según el nivel elegido.
  • ความทนทาน: una vez haces COMMIT, ลอส กัมบิออส เควดัน เปอร์ซิซิโดส incluso ante fallos.

InnoDB กับ MyISAM: เหมือนกับการนำเข้า

En MySQL existen varios เครื่องมือจัดเก็บข้อมูล. Solo InnoDB soporta transacciones และ claves foráneas- además ofrece bloqueo a nivel de fila y recuperación ante fallos. MyISAM ไม่มีธุรกรรมข้ามมิติ y Prioriza velocidad sobre ความมั่นคง, lo que es útil para ciertos escenarios de lectura intensiva, pero ไม่มีความจำเป็นต่อกรด.

การส่งอัตโนมัติ: qué es y cómo te afecta

MySQL tiene el modo กระทำการอัตโนมัติโดยข้อบกพร่อง- Esto significa que, fuera de una transacción explícita, cada sentencia DML se ยืนยันอัตโนมัติ como si estuviese envuelta por START TRANSACTION y COMMIT. Si la sentencia falla, se revierte automáticamente เจตนา ese, pero si tiene éxito, ไม่มี 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;

หลังจาก ปิดใช้งานการคอมมิตอัตโนมัติ, ลอส แคมบิโอส ไม่มีลูกชาย ถาวร รีบเร่ง COMMIT; si quieres descartarlos, สหรัฐอเมริกา ROLLBACK- สิบ en cuenta que esta configuración es por sesión y เซรีเซ็ตอาอัลเซอร์ราร์ลาโคเนซิออน.

ข้อมูลพื้นฐานของ Comandos: เริ่มการทำธุรกรรม ยอมรับ และย้อนกลับ

El ciclo típico es: transacciónเริ่มต้น, ejecutar operaciones DML และยืนยันหรือ deshacer เซกุน เอล ผลลัพธ์าโด Tienes sinónimos como BEGIN o BEGIN WORK para iniciar, y COMMIT/ROLLBACK para finalizar:

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 garantiza que la transacción ไม่สมบูรณ์ ไม่มีการยืนยัน- Si una de las cuentas ไม่มีอยู่หรือข้อจำกัด (หน้า ej., CHECK de saldo no negativo) falla, la transacción se revierte y la base queda como al principio.

Savepoints: ควบคุม fino dentro de la transacción

กับ SAVEPOINT creas puntos de recuperación dentro de una transacción para poder deshacer parcialmente sin tirar todo el trabajo:

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 พิจารณาเป็นพิเศษ ตัมเบียน puedes กำจัดด้วย RELEASE SAVEPOINT สำหรับ mantener limpia la transacción.

Niveles de aislamiento: สมดุล entre สอดคล้องและ rendimiento

ความกล้าหาญจากข้อบกพร่องใน MySQL es REPEATABLE READ, que ofrece lecturas coherentes dentro de la misma transacción gracias al multiversioning (MVCC)

ปัญหา clasicos de concurrencia que queremos acotar:

  • Lectura sucia (Dirty Read): leer cambios de otra transacción que aún no ha hecho COMMIT.
  • Lectura no repetible: leer la misma fila dos veces y obtener valores distintos por actualizaciones confirmadas de otra transacción entre ambas lecturas.
  • เลคทูร่า แฟนทาสมา: ejecutar la misma Consulta y que aparezcan filas nuevas debido a inserciones ยืนยัน por otra transacción.

Comportamiento por nivel (การฝึกซ้อมต่อ): READ UNCOMMITTED permite las tres anomalías; READ COMMITTED evita lecturas sucias pero puede sufrir ไม่มีการทำซ้ำและแฟนตาซี; REPEATABLE READ evita sucias y no repetibles โดยทั่วไปแล้ว ศักยภาพการรับเข้าเดี่ยว "แฟนตาซี"; SERIALIZABLE bloquea como si ejecutaras en serie, กำจัด 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, เซสชันหรือ globalmente. Recuerda que los cambios GLOBAL มีผลกระทบต่อการเชื่อมต่อใหม่, no a las existentes.

Bloqueos และ lecturas con bloqueo

ผู้ดูแล el aislamiento, el motor usa bloqueos (ล็อค)- InnoDB เกิดจากข้อบกพร่อง nivel de fila, ดูสิ อนุญาตให้นายกเทศมนตรีเห็นพ้องต้องกัน que el bloqueo por tabla. Un bloqueo ขัดขวาง que otras transacciones vean o alteren datos en uso mientras la tuya no haya ตอนจบ

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” ดาโตส.

โหมดการใช้งาน: อ่านเขียนและอ่านอย่างเดียว

Las transacciones pueden ประกาศ en modo READ WRITE (ค่าเริ่มต้น) หรือ READ ONLY. En modo solo lectura, no se permiten cambios sobre tablas, útil para แจ้งการทำซ้ำและทรัพย์สิน.

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

También puedes fijarlo con SET TRANSACTION, combinándolo con el nivel de aislamiento y el วง ของการสมัคร

ธุรกรรมตลาดหลักทรัพย์: aislamiento, acceso y ambitos (SESSION, GLOBAL)

ประโยค SET TRANSACTION ผู้รับใบอนุญาต establecer el nivel de aislamiento y el modo de acceso para la próxima transacción, สำหรับทั้ง เซสชั่น หรือวิธี ทั่วโลก:

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

Este control fino te permite สมดุล fiabilidad y rendimiento según el caso de uso, Desde cargas analíticas และ OLTP เห็นด้วย.

ตัวอย่างที่เห็นพ้องต้องกัน: Dirty Read, No Repetible และ Fantasma

Dirty Read (lectura sucia): una transacción B lee valores no comparisons por A. Con READ UNCOMMITTED esto es posible; con READ COMMITTED en adelante, no.

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

Lectura no repetible: B ยืนยันและอัปเดต entre dos lecturas de A. Con REPEATABLE READ lo evitas; con READ COMMITTED puede ocurrir.

-- 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. Con SERIALIZABLE se evita a costa de más 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 esencial y claves foráneas: efectos ON DELETE / ON UPDATE

El DML agrupa เลือก แทรก อัพเดต และลบ- Al definir claves foráneas en InnoDB, puedes fijar el comportamiento ante borrados/actualizaciones en la tabla การอ้างอิง:

  • RESTRICT: impide eliminar/actualizar si hay References. ความกล้าหาญของคุณอยู่ที่ MySQL.
  • CASCADE: propaga la acción a las filas hijas.
  • SET NULL: pone el valor a NULL en las filas hijas.
  • NO ACTION: เทียบเท่ากับ RESTRICT ใน MySQL
  • SET DEFAULT: ไม่มีวางจำหน่ายใน InnoDB และ MySQL

Estas reglas son clave para การอ้างอิงความสม่ำเสมอ y evitar datos huérfanos cuando trabajas con transacciones และ relaciones complejas.

Transacciones desde PHP (mysqli): คอมมิตอัตโนมัติ, คอมมิตและย้อนกลับ

Si programas en PHP con mysqli, puedes ควบคุม transacciones de forma sencilla ปิดใช้งานการคอมมิตอัตโนมัติ, ปรึกษาหารือและยืนยันหรือยืนยันผลลัพธ์:

$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, ฮาเซส rollback() y evitas inconsistencias- Luego ya ตัดสินใจ si reintentas, notificas o tomas otra acción.

ขั้นตอนการดำเนินการและข้อผิดพลาดใน MySQL

ดำเนินการตามขั้นตอนของ MySQL เพื่อประกาศ manejadores de errores สำหรับ SQLEXCEPTION y SQLWARNING, ดังนั้น ขับออกมา ROLLBACK อัตโนมัติ ante fallos:

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 cuando algo no va bien.

Casos prácticos propuestos: pon a prueba lo aprendido

Tienda de informática

  • Inserta fabricantes indicando código y nombre; y también เดี่ยว con nombre.
  • ผลิตภัณฑ์เสริม asociados a fabricantes con diferentes conjuntos de columnas (คอน y บาป código)
  • Crea la tabla fabricante_productos คอลัมน์ nombre_fabricante, nombre_producto, precio e inserta de una sola vez todos los registros จาก tienda.
  • Crea la vista vista_fabricante_productos con las tres columnas ด้านหน้า
  • Elimina fabricantes ในขณะที่ Asus o Xiaomi y razona por qué puede ไม่สามารถทำได้; อจัสตะ กลาเวส ฟอราเนียส (หน้า ej., ON DELETE) si hace falta.
  • Actualiza códigos de fabricantes (Lenovo 20, Huawei 30) y analiza las restrictiones การอ้างอิงที่จำเป็น.
  • Actualiza precios sumando 5 €ต่อสิ่งที่ต้องทำ; elimina impresoras con precio < 200 €

บุคลากร

  • Inserta departmentos con diferentes combinaciones de columnas (con y sin código, con gastos)
  • Inserta empleados vinculados a departmentos (con y sin código explícito)
  • Crea y rellena departamento_backup จาก departamento.
  • กำจัดแผนก (Proyectos, Desarrollo) y justifica si se puede o no; อาจัสตา ฟอราเนียส เด เซอร์ เนเซซาริโอ
  • Actualiza códigos (เช่น., Recursos Humanos ถึง 30; Publicidad 40) การประเมินผลกระทบต่อการอ้างอิง
  • Incrementa presupuestos +50.000 € เดี่ยวสำหรับขาดทุน < 20.000 €
  • ธุรกรรม: กำจัดความผิดบาปออกจากกันโดยยึดหลักความสอดคล้อง

การทำสวน

  • อินเซอร์ตา ออฟฟิซินา en Almería คุณเป็นตัวแทนตัวแทน de ventas
  • Inserta cliente cuyo comercial sea el empleado ด้านหน้า; crea un pedido con al menos dos productos.
  • Actualiza el código del cliente y verifica cambios en tablas relacionadas; ลบมัน y revisa efectos; ไม่มีน้ำตกหญ้าแห้ง กำหนดค่า ON DELETE CASCADE.
  • กำจัดลูกค้า sin pedidos; ต่ำกว่า 20% el precio de productos บาป pedidos; บอร์รา ปาโกส del cliente con menor límite de crédito
  • Ajusta límite de crédito 0 คำตอบสำหรับลูกค้าของเรา 11679.
  • Modifica la tabla detalle_pedido añadiendo campo iva- ไกล่เกลี่ย una transacción pon 18 a pedidos desde enero 2009 y 21 ส่วนที่เหลือ
  • เพิ่ม Campo total_linea y คำนวณ con precio_unidad*cantidad*(1 + (iva/100)) para todos los registros.
  • Borra el cliente con menor límite de crédito: evalúa si se puede con una sola Consulta y por qué.
  • อินเซอร์ตา ออฟฟิซินา en Granada con tres comerciales y ลูกค้าสามราย asociados; การซื้อขาย มีไว้สำหรับลูกค้าโดยคำนึงถึงผลิตภัณฑ์ cada uno; borra un cliente คุณ ajusta foráneas si ไม่มีหญ้าแห้ง cascada; การซื้อขาย สำหรับนายทะเบียน pagos de esos pedidos

Ensayo adicional útil: จำลอง una pérdida de conexión con SET AUTOCOMMIT = 0, cierra la sesión antes de Finalizar และ luego reconecta para comprobar qué quedó persistido y qué no. Esto te aterriza el concepto de durabilidad y atomicidad.

เปรียบเทียบอย่างรวดเร็วกับ SQL Server และ Oracle

Los conceptos son homólogos: เริ่ม/เริ่มการทำธุรกรรม, COMMIT, ย้อนกลับ y ระดับความโดดเดี่ยว- ใน SQL Server มีอยู่แล้ว niveles como ภาพรวมที่ นำเสนอ una vista สอดคล้องกันอัล inicio de la transacción บาป 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.

Preguntas típicas de Examen/entrevista

  • ¿Qué son las propiedades ACID? Defínelas y pon un ejemplo.
  • ¿Cuáles son los tres problems de concurrencia คุณชอบ mitigarlos con niveles de aislamiento ไหม?
  • คุณต้องการความช่วยเหลือจาก InnoDB หรือไม่? อ่านซ้ำได้
  • ¿Se pueden hacer transacciones กับ MyISAM? ไม่จำเป็นต้องมี InnoDB
  • ความแตกต่างระหว่าง InnoDB กับ MyISAM: transacciones, foráneas, bloqueo por fila, recuperación ฯลฯ
  • โอนเงินผ่านธนาคาร: ¿qué pasa si falla una UPDATE สื่อกลางหรือ si la cuenta ไม่มีอยู่จริงเหรอ? การตอบสนอง: การย้อนกลับ asegura ความสม่ำเสมอ

Dominar transacciones en MySQL es entender cómo se combinan ACID, การดำเนินการอัตโนมัติ, การช่วยเหลือ, bloqueos, savepoints และ modos de acceso พิทักษ์ tus datos บาป estrular el rendimiento. คอน InnoDB, tienes las herramientas สำหรับ que operaciones complejas (ปาโกส, pedidos, inventario) se comporten como una sola acción segura. อจัสต้า ตั้งค่าธุรกรรม al caso de uso, apóyate en ขั้นตอนและการควบคุมข้อผิดพลาด, y practica con los casos propuestos: el salto de calidad en tus sistemas se nota enseguida.

วิสัยทัศน์ทั่วไป เด ซิสเทมาส เด อัลมาเซนามิเอนโต เด ดาโตส
บทความที่เกี่ยวข้อง:
วิซิออน ทั่วไป เด ซิสเตมาส เด อัลมาเซนามิเอนโต เด ดาโตส
กระทู้ที่เกี่ยวข้อง: