Cơ bản về giao dịch trong MySQL: hướng dẫn ACID hoàn chỉnh, aislamiento và autocommit

Cập nhật lần cuối: 11/05/2025
  • InnoDB ofrece giao dịch ACID, bloqueo bởi fila và REPEATABLE READ bởi khiếm khuyết.
  • Controla autocommit, START TRANSACTION, COMMIT/ROLLBACK và SAVEPOINT para atomicidad real.
  • Điều chỉnh lại các điểm yếu của aislamiento và các chế độ CHỈ ĐỌC/ĐỌC VIẾT với THIẾT LẬP GIAO DỊCH.
  • Evita thành công, không lặp lại và tưởng tượng cân bằng nhất quán và kết xuất.

giao dịch mysql

Các giao dịch trong MySQL được sử dụng để điều hành dữ liệu theo hình thức bảo mật bạn có thể liên hệ với các phương án khác nhau mà bạn có thể sử dụng như một cách duy nhất. Nếu như bạn mắc phải lỗi này, queremos volver al estado anterior sin dejar la base de datas a media. Trong nghệ thuật này có một sự giải thích hoàn chỉnh và thực tiễn về chức năng của nó, điều này có nghĩa là bạn có thể cấu hình và cân bằng nhất quán và kết xuất.

Además de cubrir comandos básicos như BẮT ĐẦU GIAO DỊCH, CAM KẾT và HOÀN LẠI, veremos el papel de tự động cam kết, The niveles de aislamiento ACID, ổ khóa, điểm lưu, modos de acceso y THIẾT LẬP GIAO DỊCH. Bạn có thể bao gồm các ví dụ về một vấn đề xảy ra đồng thời, không phải là tỉnh táo InnoDB và MyISAM, cómo manejar giao dịch desde PHP (mysqli)thủ tục được lưu trữ, như một cách sử dụng pin thực tế để bạn có thể học tập. Nếu bạn chuẩn bị cho DAW, DAM hoặc ASIR, bạn sẽ phải trả giá bằng một cách anillo al dedo.

Các điểm nhấn của BD cho DAW, DAM và ASIR — Khóa học 2025/2026. Vật liệu Este tổng hợp las mejores prácticas y la teoría clave bạn cần phải nắm quyền kiểm soát để giao dịch với MySQL theo hình thức chuyên nghiệp.

Ghi: El dinero donado nos sirve para mantener nuestro sitio web, así como para generar mejor contenido. Bạn có thể sử dụng nó để tạo ra các hướng dẫn về thiết bị tiện ích và ngày hôm nay.

Đó là một giao dịch và vì nó quan trọng

Una transacción es una unidad lógica de trabajo que agrupa varias sentencias de forma que o se aplican todas o no se aplica ninguna. Điều này có vẻ không nhất quán, đặc biệt là trong các hoạt động tính toán mà bạn có thể thay đổi các bảng hoặc filas. Piensa en un traspaso entre cuentas bancarias: se descuenta de la cuenta origen y se abona en la Destinyno; nếu bạn không biết điều đó, không có puedes allowir que la otra quede confirmada sola.

MySQL, con el motor InnoDB, triển khai các giao dịch theo mô hình ACID, tỷ lệ đảm bảo chắc chắn về sự tích hợp bao gồm trước khi rơi vào hệ thống hoặc vỏ não. Nếu bạn ở SGBD, bạn sẽ được gửi đến nhà: los conceptos clave son los mismos.

Propiedades ACID: las cuatro garantías

  • Tính nguyên tử: khối đó được coi là không thể chia cắt; o việc cần làm OK không nada. Nếu một hoạt động thất bại, bạn sẽ phải xem lại những việc cần làm liên quan.
  • Kiên định: cada giao dịch sẽ là cơ sở dữ liệu của một válido otro. Không có quy định nào về thương mại dễ bị tổn thương đối với những dữ liệu không thể áp dụng được.
  • Sự cô lập: lo que xảy ra trong một giao dịch no debe can thiệp vào câu afectado bởi vì những người khác sẽ được đưa ra và song song, đó là một điều tuyệt vời.
  • Độ bền: una vez haces COMMIT, los cambios quedan Persistidos incluso ante fallos.

InnoDB vs MyISAM: động cơ rất quan trọng

En MySQL existen varios động cơ lưu trữ. Solo InnoDB có thể giao dịch và cung cấp dịch vụ; adeás ofrece bloqueo a nivel de fila y recuperación ante fallos. MyISAM không có giao dịch soporta và ưu tiên tốc độ nhất quán, lo que es tiện ích cho các kịch bản giảng dạy chuyên sâu, pero không cần thiết phải có ACID.

Autocommit: qué es y cómo te afecta

MySQL tiene el modo autocommit kích hoạt bởi lỗi. Điều này có ý nghĩa quan trọng đối với một giao dịch được giải thích, câu trả lời DML được xác nhận tự động như bạn đang cảm thấy thú vị bởi START TRANSACTION y COMMIT. Si la sentencia falla, se revierte automáticamente Đây là ý định, nếu bạn muốn, không có cách nào để gỡ bỏ hướng dẫn sử dụng ROLLBACK.

Bạn có thể bắt đầu một giao dịch với START TRANSACTION, MySQL ngừng kích hoạt tạm thời và tự động cam kết cần phải có COMMIT o ROLLBACK. Có thể khắc phục lỗi tự động cam kết ở giai đoạn cuối SET:

-- Ver el valor actual
SELECT @@autocommit;

-- Desactivar autocommit en la sesión actual
SET autocommit = 0;

-- Activarlo de nuevo
SET autocommit = 1;

Sau khi hủy kích hoạt tự động cam kết, los cambios no son Permanentes hasta que ejecutes COMMIT; si quieres descartarlos, Hoa Kỳ ROLLBACK. Mười điều cần thiết để cấu hình trong phiên này se thiết lập lại mối quan hệ.

Comandos básicos: BẮT ĐẦU GIAO DỊCH, CAM KẾT và HOÀN LẠI

El ciclo típico es: giao dịch bắt đầu, thực hiện hoạt động DML và xác nhận hoặc hủy bỏ kết quả thứ hai. Tienes sinónimos như BEGIN o BEGIN WORK para iniciar, y COMMIT/ROLLBACK để hoàn thiện:

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 hoặc bạn có thể tham gia vào việc hủy kích hoạt tự động, InnoDB đảm bảo rằng giao dịch chưa hoàn chỉnh không được xác nhận. Si una de las cuentas không tồn tại hoặc una hạn chế (p. ej., CHECK de saldo no negativo) falla, la transacción se reviete và cơ sở đó là như một nguyên tắc.

Điểm lưu: kiểm soát tài chính của giao dịch

với SAVEPOINT số điểm phục hồi trong một giao dịch cho 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 định nghĩa các biến thể SAVEPOINT với tên sai lầm, MySQL xem xét cuối cùng. También puedes eliminarlos con RELEASE SAVEPOINT para mantener khập khiễng trong giao dịch.

Niveles de aislamiento: cân bằng giữa sự nhất quán và kết quả

Giá trị của nó bị lỗi trong MySQL es REPEATABLE READ, những bài giảng mạch lạc về giao dịch sai lầm trong đa phiên bản (MVCC).

Các vấn đề kinh điển đồng thời que queremos acotar:

  • Lectura sucia (Đọc bẩn): leer cambios de otra giao dịch que aún no ha hecho COMMIT.
  • Lectura no repetitible: leer la misma fila dos veces y obtener valores distintos por actualizaciones confirmadas giao dịch khác trong các bài giảng.
  • Lectura fantasma: ejecutar la misma tư vấn và que aparezcan filas nuevas gỡ lỗi để xác nhận thêm thông tin về giao dịch khác.

Công việc của một người mới (sơ yếu lý lịch thực hành): READ UNCOMMITTED permite las tres anomalías; READ COMMITTED evita lecturas sucias pero puede sufrir không lặp lại và tưởng tượng; REPEATABLE READ evita sucias y no repetibles y, nói chung, solo thừa nhận tiềm năng “fantasmas”; SERIALIZABLE bloquea giống như một loạt phim, loại bỏ những thứ trên costa de más bloqueos.

-- Consultar nivel de aislamiento (sesión y global)
SELECT @@transaction_isolation;     -- sesión
SELECT @@global.transaction_isolation; -- global

Bạn có thể điều chỉnh lại hoạt động của mình bằng giao dịch, tiếp theo hoặc toàn cầu hóa. Người tìm kiếm sự cambios GLOBAL ảnh hưởng đến các mối quan hệ mới, no a las existentes.

Khối và bài giảng với khối

Para mantener el aislamiento, el motor usa bloqueos (khóa). InnoDB bị lỗi bởi lỗi a nivel de fila, lo que allowe thị trưởng đồng tình que el bloqueo por tabla. Một điều cản trở các giao dịch khác hoặc thay đổi dữ liệu được sử dụng mientras la tuya no haya Finalizado.

Bắt đầu từ đầu đến cuối và hoạt động, MySQL có thể yêu cầu các bài giảng hoặc văn bản. Ví dụ SERIALIZABLE với việc tự động ngừng hoạt động giảng dạy và trao đổi để cải thiện tính nhất quán. Mục tiêu là tránh giao dịch giao tiếp với bạn “tức thời” dữ liệu.

Các phương thức truy cập: ĐỌC VIẾT và CHỈ ĐỌC

Các giao dịch có thể được khai báo theo phương thức READ WRITE (mặc định) hoặc READ ONLY. En modo solo lectura, no se permiten cambios bảng màu nhẹ nhàng, hữu ích để thông báo khả năng tái tạo và sản phẩm.

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

También puedes fijarlo con SET TRANSACTION, kết hợp với nivel de aislamiento y el ambit ứng dụng.

SET GIAO DỊCH: aislamiento, acceso y timbitos (SESSION, GLOBAL)

Kết án SET TRANSACTION cho phép thiết lập một nivel de aislamiento và phương thức truy cập vào la próxima transacción, Cho toàn bộ phiên hoặc cách toàn cầu:

-- 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 khả năng cân bằng cân bằng và kết xuất theo trường hợp sử dụng, desde cargas phân tích và đồng thời OLTP.

Ví dụ về sự đồng tình: Đọc bẩn, Không lặp lại và Tưởng tượng

Dirty Read (lectura sucia): una giao dịch B lee valores no confirmados 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 repetitible: B xác nhận CẬP NHẬT trong bài giảng của 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;

Lectura fantasma: trong các tư vấn về dữ liệu tổng hợp, các giao dịch khác chèn các tập tin mà bạn muốn vào bộ lọc. 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 cần thiết và các phần dành cho: hiệu ứng TRÊN XÓA / TRÊN CẬP NHẬT

El DML agrupa CHỌN, CHÈN, CẬP NHẬT và XÓA. Những điều được xác định dành cho InnoDB, có thể được sử dụng trong công việc trước khi thực hiện/thực tế hóa và bảng tham khảo:

  • RESTRICT: cản trở việc loại bỏ/thực tế nếu bạn tham khảo. Đó là giá trị của lỗi trong MySQL.
  • CASCADE: tuyên truyền hành động trên sợi tóc hijas.
  • SET NULL: pone el valor a NULL en las filas hijas.
  • NO ACTION: tương đương a RESTRICT trong MySQL.
  • SET DEFAULT: không có sẵn cho InnoDB và MySQL.

Estas reglas son clave para asegurar nhất quán tham khảo và evitar datatos huérfanos cuando trabajas với các giao dịch và các mối quan hệ phức tạp.

Giao dịch từ PHP (mysqli): tự động cam kết, cam kết và khôi phục

Si programas en PHP con mysqli, bạn có thể kiểm soát các giao dịch hình thức. Tắt tự động cam kết, bạn sẽ được tư vấn và xác nhận hoặc xem lại kết quả sau:

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

Với mô hình này, si cualquier sentencia falla, haces rollback() y evitas inconsistencias. Luego ya quyết định nếu bạn phục hồi, thông báo hoặc cho bất kỳ hành động nào khác.

Quy trình cũ và các lỗi trong MySQL

Quy trình cũ của MySQL có thể được khai báo manejadores de errores para SQLEXCEPTION y SQLWARNING, vậy nên phóng ra ROLLBACK tự động 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 ;

Bạn có thể sử dụng một cách dễ dàng để làm điều đó với nhiều mẹo khác nhau nếu bạn gặp phải lỗi lớn. Mục tiêu là trung tâm đảo ngược và giải quyết tình trạng khập khiễng cơ bản cuando algo no va bien.

Những hành động thực tiễn của bạn: pon a prueba lo aprendido

Tienda de informática

  • Inserta fabricantes indicando código y nombre; y también solo con nombre.
  • Inserta productos asociados a Fabricantes con diferentes conjuntos de columnsas (con y sin código).
  • Crea la tabla fabricante_productos con columnas nombre_fabricante, nombre_producto, precio e chèn một trong những điều cần làm vào sổ đăng ký từ tienda.
  • Crea la vista vista_fabricante_productos con las tres cột trước.
  • Elimina fabricantes như Asus o Xiaomi y razona por que puede no ser posible; ajusta claves foráneas (p. ej., ON DELETE) si hace falta.
  • Actualiza códigos de fabricantes (Lenovo vào lúc 20 giờ, Huawei a 30) và phân tích các hạn chế tham khảo cần thiết.
  • Actualiza precios sumando 5 € cho tất cả các sản phẩm; loại bỏ các nhà sản xuất con precio < 200 €.

Nhân viên

  • Inserta departamentos con diferentes combinaciones de columnsas (con y sin código, con gastos).
  • Inserta empleados vinculados a depamentos (con y sin código explícito).
  • Crea y rellena departamento_backup từ departamento.
  • Elimina departamentos (Proyectos, Desarrollo) y justifica si se puede o no; điều chỉnh cho những gì cần thiết.
  • Actualiza códigos (ví dụ., Recursos Humanos đến 30; Publicidad a 40) đánh giá tác động tham khảo.
  • Incrementa presupuestos +50.000 € một mình với số tiền thua < 20.000 €.
  • Giao dịch: elimina empleados sin departamento asociado garantizando constence.

Làm vườn

  • Inserta oficina en Almería và một người đại diện được tuyển dụng.
  • Inserta cliente cuyo thương mại biển el empleado trước; crea un pedido con al menos dos productos.
  • Cập nhật khách hàng có sẵn và xác minh cambios trong tablas relacionadas; xóa đi và hiệu ứng sửa đổi; si no hay cascadas, cấu hình ON DELETE CASCADE.
  • Loại bỏ khách hàng không có tội phạm; sube un 20% giá trị sản phẩm của tội phạm; borra pagos khách hàng với giới hạn tín dụng.
  • Ajusta límite de crédito a 0 para el cliente con menos unidades del productiono 11679.
  • Modifica la tabla detalle_pedido añadiendo campo iva; trung gian cho một giao dịch 18 a pedidos desde enero 2009 y 21 phần còn lại.
  • Thêm cắm trại total_linea y tính toán con precio_unidad*cantidad*(1 + (iva/100)) para todos los registros.
  • Borra el cliente với giới hạn tín dụng: đánh giá xem bạn có thể tư vấn một cách đơn giản và vì nó không.
  • Inserta oficina en Granada con tres comerciales y tres clientes các nhóm; giao dịch cho một pedido por cliente con dos productionos cada uno; borra un cliente y ajusta foráneas si no hay cascada; giao dịch cho nhà đăng ký pagos de pedidos.

Ensayo adicional útil: mô phỏng một mối quan hệ với con người SET AUTOCOMMIT = 0, chuẩn bị cho giai đoạn cuối cùng và cần phải điều chỉnh để giải quyết vấn đề kiên trì và không. Đây là nguyên nhân gây ra khái niệm về độ bền và nguyên tử.

So sánh nhanh chóng với SQL Server và Oracle

Los conceptos son homólogos: BẮT ĐẦU/KHỞI ĐỘNG GIAO DỊCH, CAM KẾT, QUAY LẠI y mức độ cô lập. En SQL Server tồn tại với nhiều cấp độ khác nhau TÓM TẮTĐó trình bày một quan điểm nhất quán về sự khởi đầu của giao dịch Tôi sẽ không thể làm điều đó giống như SERIALIZABLE. Oracle ofrece un conjunto tương tự de niveles; en la practica, cambia el “dialecto” pero la música es la misma: se busca el punto óptimo entre aislamiento và rendimiento.

Preguntas típicas de Examen/entrevista

  • ¿Qué son las propiedades ACID? Defínelas y pon un ejemplo.
  • ¿Cuáles con trai gặp phải vấn đề đồng tình Bạn có muốn giảm nhẹ bệnh tật với aislamiento không?
  • ¿Cuál này là gì do lỗi trong InnoDB? ĐỌC LẶP LẠI.
  • ¿Bạn có thể giao dịch với MyISAM không? Không, cần phải có InnoDB.
  • Sự khác biệt giữa InnoDB và MyISAM: transacciones, foráneas, bloqueo por fila, recuperación, v.v.
  • Chuyển khoản ngân hàng: ¿qué pasa si falla una UPDATE intermedia hoặc si la cuenta không tồn tại? Phản hồi: khôi phục asegura nhất quán.

Các giao dịch thống trị trong MySQL được kết hợp với nhau ACID, autocommit, aislamiento, bloqueos, savepoints và các phương thức truy cập para proteger tus datos sin estrangular el rendimiento. Với InnoDB, tienes las herramientas para que operaciones complejas (pagos, pedidos, inventario) bạn có thể thực hiện như một hành động duy nhất được đảm bảo. Ajusta THIẾT LẬP GIAO DỊCH al caso de uso, apóyate en quy trình và kiểm soát lỗi, và thực hành với các trường hợp propuestos: el salto de calidad en tus system se nota enseguida.

tầm nhìn chung về hệ thống dữ liệu cũ
Bài viết liên quan:
Xem tổng thể các hệ thống dữ liệu cũ
bài viết liên quan: